2017-08-10 1 views
0

私は/ etc/sudoersで一番長い行を出したいと思っています。
wc。 AWK行内のホワイトスペースの数を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トリートわずか1空白として27行に8つの空白について

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

、8-1 = 7,90-83 = 7。
したがって、wcで得られた数値はawkより7大きいです。
awkが1行ではなく、27行目の8個の空白をそのまま扱うように、awkで行のホワイトスペースの数を変更しないでください。
コマンド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,トイレ

」はファイルごと 最長の行の長さを印刷し、そして複数のファイルが存在する場合には、それらの長さの最大 (不和)を印刷します。ここでの行の長さは、現在のロケールに応じてスクリーンカラムで測定された であり、8番目のカラムごとにタブの位置を仮定すると です。

したがって、wcは各タブの幅を8と仮定しています。これをawkでエミュレートする必要があります。行の先頭にタブだけがある特殊なケースの1つは、簡単に修正できます。あなたはファイルのhexdumpから見ることができるように

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

debian @ wifi:〜$ sudo awk '{行= 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ファイル内の行の最大長は、タブが含まれて、

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

あなたは09 2間の秒(16進数が表示されることがあります73)。それをアスキーテーブルに見ると、水平タブとなります。

あなたは

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

wc'\t'wc -Lと同じ結果をすることができawk出力を作るための別の方法

8としての長さを扱っていました、@Dmitri Chubarovの回答から見ることができます関数 match($0,/\t/)?1:0が存在する場合は1を返し、存在する場合は長さを7とします。

関連する問題