2017-08-10 49 views
0

我想獲得/ etc/sudoers中最長的行。
對於wc。如何通過awk將whitspace的數量保持不變?

sudo wc -L /etc/sudoers 
90 /etc/sudoers 

對於AWK

sudo awk '{if(length>L){L=length;s=$0}}END{print NR,L,s}' /etc/sudoers 
27 83 Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" 

AWK治療8個空格在第27行中僅有1的空白,8-1 = 7,90-83 = 7。
所以用wc得到的數字比awk大7。
如何用awk保持行內空白空間的數量不變,以使awk將第27行中的8個空格保持不變,而不是1.
如何修復命令sudo awk '{if(length>L){L=length;s=$0}}END{print NR,L,s}' /etc/sudoers,用awk輸出以下結果。

27 90 Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" 

回答

1

這可能是因爲該文件包含選項卡。

隨着--max-line-length' option, WC」打印每個文件的 最長行的長度,並且如果存在一個以上的文件它打印 那些長度的最大值(未總和)。此處的行長度爲 ,根據當前的區域設置,並假設屏幕列中每個第8列的位置爲 。

所以wc假設每個標籤的寬度爲8.我們必須在awk中模擬這個。一個特殊的情況是,該選項卡只出現在行首時很容易修補。

sudo awk '{sub("\t","  ") ; 
    if(length>L){L=length;s=$0}}END{print NR,L,s}' /etc/sudoers 
+0

debian @ wifi:〜$ sudo awk'{line = gensub(「^ \ t」,「」,「1」);如果(長度(行)> L){L =長度(行); s =行}} END {print NR,L,s}'/ etc/sudoers –

+1

awk:第3行:函數gensub永遠不會定義 –

+0

@ it_is_a_literature如果你不使用'gawk',那麼'sub'應該是可用的。更新命令 –

1

在/ etc線的最大長度/ sudoers文件包含一個選項卡,你可以從文件的hexdump看到,

$ sudo cat /etc/sudoers | hexdump -C 
... 
... 
00000110 73 73 0a 44 65 66 61 75 6c 74 73 09 73 65 63 75 |ss.Defaults.secu| 
... 
... 

您可能會請參閱s 09 2之間(十六進制: 73)。並將其放入ascii表中,這將是水平標籤

你可以從@Dmitri Chubarov的回答看,wc會像對待的'\t'長度爲8

的另一種方式使awk輸出相同的結果wc -L就可以了,

$ sudo awk '{if(length>L){L=7*(match($0,/\t/)?1:0)+length;s=$0}}END{print NR,L,s}' /etc/sudoers 
30 100 Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin" 

的函數match($0,/\t/)?1:0會返回1任何\t存在,如果是,則添加7。