2009-10-21 43 views
78

我想從DbgView日誌文件中刪除前兩列(我不感興趣)。我似乎無法找到一個從列3開始直到行結束的例子。請注意,每一行的列數都是可變的。如何打印第三列到最後一列?

+0

[使用awk打印所有列從第n個到最後一個]的可能的重複(http://stackoverflow.com/questions/2961635/using-awk-to-print-all-columns-from-the-nth最後) – 2015-07-19 14:46:38

回答

87

...或者簡單的解決方案:cut -f 3- INPUTFILE只是添加正確的分隔符(-d)和你有同樣的效果。

+4

請注意,這僅適用於所有列之間的分隔符完全相同的情況。例如,不能使用帶\ d +等分隔符的cut。 (我知道的) – 2010-01-13 21:11:48

+42

當問題標題爲awk時,接受awk以外的答案是不合適的。如果人們需要它用於awk腳本呢?這個答案應該只是一個評論。 – syaz 2010-11-01 04:17:53

+16

@SyaZ:通常我會同意,但是在這個板子上的'無償awk'的數量,我認爲這是需要展示一個替代方式來完成這個任務。如果有人向你展示了一種更簡單快捷的方式來完成同樣的任務,你會不會感激?也許海報認爲awk是唯一能夠做到這一點的方法,因爲「沒有不正確,但肯定可以改進」其他問題的答案。 – Marcin 2010-11-01 13:24:54

76
awk '{for(i=3;i<=NF;++i)print $i}' 
+3

awk'{for(i = 3; i <= NF; ++ i)print $ i}'更加緊湊。 :) – user172818 2009-10-21 16:58:31

+1

謝謝,lh3。我只是在複製和粘貼gawk手冊。 :) – 2009-10-21 17:07:13

+2

從。從。從。 – 2009-10-21 17:08:14

3

那麼,你可以很容易地使用正則表達式來實現相同的效果。假定分隔符是空格,它看起來像:

awk '{ sub(/[^ ]+ +[^ ]+ +/, ""); print }' 
+1

我會避免使用正則表達式。意外地搞砸可能會更慢,更容易。 – Cascabel 2009-10-21 17:13:00

+1

它縮短它像這樣:'awk'{sub(/([^] + +){2} /,「」);打印}「,它將圖案帶走兩次。 – erik 2014-01-11 15:10:31

26

Jonathan Feinberg的答案在單獨的行上打印每個字段。您可以使用printf重建同一行上的輸出記錄,但也可以將字段向左跳轉。

awk '{for (i=1; i<=NF-3; i++) $i = $(i+3); NF-=3; print}' logfile 
14
awk '{$1=$2=$3=""}1' file 

注:此方法將留下「空白」 1,2,3字段,但不是一個問題,如果你只是想看看輸出。

+0

該命令在每行的開始處放置一個空格。 – Nathan 2014-01-15 19:59:44

+0

用'|來追蹤那個命令sed s/^ \ * // |列-t「去除前導空格並對齊其餘列 – MSpreij 2014-09-09 13:57:50

5

約以下行內容:基於@ ghostdog74建議

awk '{$1=$2=$3=""; print}' file

。煤礦應該表現更好,當你過濾行,即:

awk '/^exim4-config/ {$1=""; print }' file
+2

該命令在每行的開始處放置一個空格。 – Nathan 2014-01-15 20:00:12

1

有點晚了這裏,但沒有上面似乎工作。試試這個,使用printf,在每個之間插入空格。我選擇了最後沒有換行。

awk '{for(i=3;i<=NF;++i) printf("%s ", $i) }' 
8
awk -v m="\x0a" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}' 

這扒什麼是特定領域NR之前,N,並打印該行的所有其餘部分,包括現場nr.N並保持原有的間距(不格式化)。如果字段的字符串也出現在行中的其他位置,這不是問題,這是daisaa的答案。

定義一個函數:

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

而且使用這樣的:

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

輸出保持的一切,包括尾隨空格

行之有效的文件,其中 '/ n' 爲記錄分隔符,這樣你就不會在行內出現新的字符。如果您想與其他記錄分隔符一起使用,請使用:

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

例如。只要不使用十六進制字符nr,幾乎可以與所有文件一起使用。 1行內。

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

打印從第四場中它們在原始文件

+0

的記錄,這不起作用。對不起,這不是很正確的答案。它太具體了,但我不知道如何刪除它 – Massimo 2014-11-14 10:18:03

2

相同的順序開始到最後一個字段記錄下列AWK命令打印在的端部的每一行的最後N場行打印新行字符:

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

查找下面,列出了/ usr/bin目錄的內容,然後保存在最後3行,然後用awk打印每行的最後4列的例子:

$ 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 
2

Perl的解決方案:

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

使用這些命令行選項:

  • -n環圍繞輸入文件的每一行,不自動打印每行

  • -l在處理之前刪除換行符,並將它們添加回af terwards

  • -a autosplit模式 - 將輸入行分割到@F數組中。默認爲分裂上的空白

  • -e執行Perl代碼

splice @F,0,2乾淨地移除列0和1從@F陣列

join " ",@F加入@F數組的元素,使用每個元素之間的空格

如果輸入文件是逗號分隔的,而不是空格分隔的,請使用-F, -lane


Python的解決方案:

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

0

如果只有約忽略了前兩個字段,如果屏蔽這些字段(如一些答案上面做的),當您不想要一個空間:

awk '{gsub($1" "$2" ",""); print;}' file 
1

在bash,那麼你可以使用下面的語法與位置參數:

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

瞭解更多:Handling positional parameters在打擊黑客維基

0
awk '{$1=$2=""}1' FILENAME | sed 's/\s\+//g' 

前兩列被清除,sed刪除前導空格。

2
awk '{a=match($0, $3); print substr($0,a)}' 

首先找到第三列開始位置。 對於substr,您將打印從位置(本例中爲a)開始的整行($ 0)到行尾。

0

在AWK列稱爲字段,因此NF是關鍵

所有行:

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

只有第一行:

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

如果你想打印後列第三例如在同一行中,您可以使用:

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

例如:

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 

它會打印:

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 

正如我們所看到的,工資單即使有空間,顯示了正確的路線。

相關問題