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.
19 answers
...lub prostsze rozwiązanie: cut -f 3- INPUTFILE
po prostu dodaj właściwy ogranicznik (- d) i uzyskasz ten sam efekt.
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}'
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/
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
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.
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.
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}' fileNa podstawie sugestii @ ghostdog74. Mój powinien zachowywać się lepiej, gdy filtrujesz linie, tzn.:
awk '/^exim4-config/ {$1=""; print }' file
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.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.
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
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 }'
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" "}'
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
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) }'
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
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
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
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.
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>
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