Jak wydrukować trzecią kolumnę do ostatniej kolumny?

Próbuję usunąć dwie pierwsze kolumny (z których nie jestem zainteresowany) z pliku dziennika DbgView. Nie mogę znaleźć przykładu, który drukuje od Kolumny 3 aż do końca wiersza. Zauważ, że każda linia ma zmienną liczbę kolumn.

Author: Sparhawk, 2009-10-21

19 answers

...lub prostsze rozwiązanie: cut -f 3- INPUTFILE po prostu dodaj właściwy ogranicznik (- d) i uzyskasz ten sam efekt.

 114
Author: Marcin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-15 20:11:15
awk '{for(i=3;i<=NF;++i)print $i}' 
 116
Author: Jonathan Feinberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-21 17:06:45
awk '{ print substr($0, index($0,$3)) }'

Znaleziono rozwiązanie here:
http://www.linuxquestions.org/questions/linux-newbie-8/awk-print-field-to-end-and-character-count-179078/

 108
Author: daisaa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-08 21:52:26

Odpowiedź Jonathana Feinberga wyświetla każde pole w osobnej linii. Możesz użyć printf do odbudowy rekordu dla wyjścia w tej samej linii, ale możesz także po prostu przesunąć pola o skok w lewo.

awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}' logfile
 35
Author: Dennis Williamson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-04 15:41:06
awk '{$1=$2=$3=""}1' file

NB: ta metoda pozostawi "spacje" w polach 1,2,3, ale nie stanowi problemu, jeśli chcesz tylko spojrzeć na wynik.

 22
Author: ghostdog74,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-24 02:33:36

Jeśli chcesz wydrukować kolumny po 3. na przykład w tej samej linii, możesz użyć:

awk '{for(i=3; i<=NF; ++i) printf "%s ", $i; print ""}'

Na przykład:

Mar 09:39 20180301_123131.jpg
Mar 13:28 20180301_124304.jpg
Mar 13:35 20180301_124358.jpg
Feb 09:45 Cisco_WebEx_Add-On.dmg
Feb 12:49 Docker.dmg
Feb 09:04 Grammarly.dmg
Feb 09:20 Payslip 10459 %2828-02-2018%29.pdf

Wydrukuje:

20180301_123131.jpg
20180301_124304.jpg
20180301_124358.jpg
Cisco_WebEx_Add-On.dmg
Docker.dmg
Grammarly.dmg
Payslip 10459 %2828-02-2018%29.pdf

Jak widać, payslip nawet ze spacją, pokazuje się we właściwej linii.

 12
Author: Brother,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-06 11:55:19

A co z następującym wierszem:

awk '{$1=$2=$3=""; print}' file
Na podstawie sugestii @ ghostdog74. Mój powinien zachowywać się lepiej, gdy filtrujesz linie, tzn.:
awk '/^exim4-config/ {$1=""; print }' file
 9
Author: Wawrzek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-02 22:26:07
awk -v m="\x0a" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'

To wycina to, co jest przed podanym polem nr., N i wypisuje całą resztę wiersza, łącznie z polem nr.N i zachowując oryginalny odstęp (nie formatuje). Nie ma znaczenia, czy ciąg pola pojawia się również gdzieś indziej w linii, co jest problemem z odpowiedzią daisaa.

Zdefiniuj funkcję:

fromField () { 
awk -v m="\x0a" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}'
}

I użyj go tak:

$ echo "  bat   bi       iru   lau bost   " | fromField 3
iru   lau bost   
$ echo "  bat   bi       iru   lau bost   " | fromField 2
bi       iru   lau bost 

Wyjście utrzymuje wszystko, łącznie ze spacjami końcowymi

Działa dobrze dla plików gdzie '/ n' jest separatorem rekordów, więc nie masz znaku nowej linii wewnątrz linii. Jeśli chcesz użyć go z innymi separatorami rekordów, użyj:

awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
Na przykład. Działa dobrze z prawie wszystkimi plikami, o ile nie używają znaku szesnastkowego nr. 1 wewnątrz linii.
 8
Author: Robert Vila,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-16 19:36:17
awk '{a=match($0, $3); print substr($0,a)}'

Najpierw znajdziesz pozycję początku trzeciej kolumny. Za pomocą substr wydrukujesz całą linię ($0) zaczynając od pozycji (w tym przypadku a) do końca linii.

 5
Author: Mitchjol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-10 11:08:13

Następujące polecenie awk wypisuje Ostatnie N pól każdej linii, a na końcu linii wypisuje nowy znak linii:

awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'

Poniżej znajduje się przykład, który wyświetla zawartość katalogu / usr / bin, a następnie przechowuje Ostatnie 3 linie, a następnie wyświetla ostatnie 4 kolumny każdej linii za pomocą awk:

$ ls -ltr /usr/bin/ | tail -3
-rwxr-xr-x 1 root root       14736 Jan 14  2014 bcomps
-rwxr-xr-x 1 root root       10480 Jan 14  2014 acyclic
-rwxr-xr-x 1 root root    35868448 May 22  2014 skype

$ ls -ltr /usr/bin/ | tail -3 | awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'
Jan 14 2014 bcomps 
Jan 14 2014 acyclic 
May 22 2014 skype
 4
Author: funk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-08 14:44:04

Cóż, możesz łatwo osiągnąć ten sam efekt za pomocą wyrażenia regularnego. Zakładając, że separator jest spacją, wyglądałby następująco:

awk '{ sub(/[^ ]+ +[^ ]+ +/, ""); print }'
 3
Author: Eddie Sullivan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-21 17:03:18
awk '{print ""}{for(i=3;i<=NF;++i)printf $i" "}'
 3
Author: luigi9876,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-01 12:16:19

Rozwiązanie Perla:

perl -lane 'splice @F,0,2; print join " ",@F' file

Używane są następujące opcje wiersza poleceń:

  • -n pętla wokół każdej linii pliku wejściowego, nie Drukuj automatycznie każdej linii

  • -l usuwa nowe linie przed przetworzeniem, a następnie dodaje je z powrotem

  • -a tryb autosplit-podział linii wejściowych na tablicę @F. Domyślnie dzielenie na białe znaki

  • -e Wykonaj kod Perla

splice @F,0,2 usuwa kolumny 0 i 1 z tablicy @F

join " ",@F dołącza elementy tablicy @F, używając spacji pomiędzy każdym elementem

Jeśli plik wejściowy jest rozdzielany przecinkami, a nie spacjami, użyj -F, -lane


Rozwiązanie Pythona:

python -c "import sys;[sys.stdout.write(' '.join(line.split()[2:]) + '\n') for line in sys.stdin]" < file

 2
Author: Chris Koknat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-08 21:38:59

Trochę za późno, ale żadne z powyższych nie zadziałało. Spróbuj tego, używając printf, wstawia spacje między każdym z nich. Zdecydowałem się nie mieć newline na końcu.

awk '{for(i=3;i<=NF;++i) printf("%s ",  $i) }'
 1
Author: Ross,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-24 20:41:34
awk '{for (i=4; i<=NF; i++)printf("%c", $i); printf("\n");}'

Wypisuje rekordy od czwartego pola do ostatniego w tej samej kolejności, w jakiej znajdowały się w oryginalnym pliku

 1
Author: Massimo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-14 10:34:15

W Bash możesz używać następującej składni z parametrami pozycyjnymi:

while read -a cols; do echo ${cols[@]:2}; done < file.txt

Dowiedz się więcej: Obsługa parametrów pozycyjnych na Bash hackers Wiki

 1
Author: kenorb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-10 03:01:24

Jeśli chodzi tylko o ignorowanie dwóch pierwszych pól i jeśli nie chcesz spacji podczas maskowania tych pól (jak niektóre z powyższych odpowiedzi):

awk '{gsub($1" "$2" ",""); print;}' file
 0
Author: champost,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-21 04:10:29
awk '{$1=$2=""}1' FILENAME | sed 's/\s\+//g'

Pierwsze dwie kolumny są wyczyszczone, sed usuwa początkowe spacje.

 0
Author: sjas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-23 12:48:35

W AWK kolumny nazywane są polami, stąd NF jest kluczem

Wszystkie wiersze:

awk -F '<column separator>' '{print $(NF-2)}' <filename>

Tylko pierwszy wiersz:

awk -F '<column separator>' 'NR<=1{print $(NF-2)}' <filename>
 -2
Author: angelo.mastro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-01 16:02:16