awk $ 1が何であるか混乱しているようです。

awk $ 1が何であるか混乱しているようです。

私はしばしばawkを使ってログを解析します。私はこのようなことを見たことがありません。 「100」を含むファイルが6つあり、印刷する列を選択します。

me:~/tmp> grep 100 *.dl.tst

私が期待するものを出力します:

100  139M  100  139M    0     0  6376k      0  0:00:22  0:00:22 --:--:-- 6539k
100  139M  100  139M    0     0  6677k      0  0:00:21  0:00:21 --:--:-- 6579k
100  139M  100  139M    0     0  6022k      0  0:00:23  0:00:23 --:--:-- 6093k
100  139M  100  139M    0     0  13.9M      0  0:00:10  0:00:10 --:--:-- 14.3M
100  139M  100  139M    0     0  14.3M      0  0:00:09  0:00:09 --:--:-- 14.7M
100  139M  100  139M    0     0  13.2M      0  0:00:10  0:00:10 --:--:-- 13.3M

次のように:

me:~/tmp> grep 100 *.dl.tst|awk '{print$0}'
100  139M  100  139M    0     0  6376k      0  0:00:22  0:00:22 --:--:-- 6539k
100  139M  100  139M    0     0  6677k      0  0:00:21  0:00:21 --:--:-- 6579k
100  139M  100  139M    0     0  6022k      0  0:00:23  0:00:23 --:--:-- 6093k
100  139M  100  139M    0     0  13.9M      0  0:00:10  0:00:10 --:--:-- 14.3M
100  139M  100  139M    0     0  14.3M      0  0:00:09  0:00:09 --:--:-- 14.7M
100  139M  100  139M    0     0  13.2M      0  0:00:10  0:00:10 --:--:-- 13.3M

その場合、$1ファイル名になる理由は次のとおりです。

me:~/tmp> grep 100 *.dl.tst|awk '{print$1}'
shpr002.20201124_141036.dl.tst:
shpr003.20201124_141036.dl.tst:
shpr004.20201124_141036.dl.tst:
hipr002.20201124_141036.dl.tst:
hipr003.20201124_141036.dl.tst:
hipr004.20201124_141036.dl.tst:

そして$2

me:~/tmp> grep 100 *.dl.tst|awk '{print$2}'
0
0
0
0
0
0

私のシェルがめちゃくちゃになった場合に備えてログアウトしてから再度ログインしました。変更はありません。私が何を間違っているのでしょうか?

出力grep 100 *.dl.tst | awk '{print$1}' | head -n1 | od -c (一部のアルファベット文字が置き換えられましたx。上記のリストは編集/難読化されました)

0000000   x  s   h   p   r   0   0   2   x   x   x  .   x   x   x   .
0000020   x   x   x   x   .   c   o   m   .   2   0   2   0   -   1   1
0000040   -   2   4   _   1   4   1   0   3   6   .   d   l   .   t   s
0000060   t   :  \r  \n
0000064

ベストアンサー1

これらのファイルにはダウンロードしたファイルの出力が含まれており、curlダウンロードcurl中にキャリッジリターン文字(ほとんど\rの場合はキャリッジリターンを生成するために使用されるエスケープ文字で表されます)を出力して進捗情報を更新します。先頭をファイルに保存します。ワイヤー。

を実行すると、grep 100 *.dl.tst出力の各行はファイル名で始まりますが、複数の更新によってカーソルが行の先頭に戻るため、ファイル名は表示されません。後続の出力はファイル名を上書きします。さらに詳しく見ると、出力は次のようになります。

shpr002.20201124_141036.dl.tst:

キャリッジリターンが続き、最初の進行出力が続きますcurl

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0

次に、パーセンテージが100に達するまでキャリッジリターンなどを実行します。これらはすべて改行ではなくキャリッジリターンで区切られているため、1行として計算され、行全体grepと一致します。

同じ効果の出力を説明しますgrep 100 *.dl.tst|awk '{print$0}'

AWK に出力を要求すると、$1最初のフィールドが出力され、表示されます。これには、ファイル名、コロン、キャリッジリターンが含まれます。curl出力の先頭とスペース(パーセント計算のために省略されているスペース)はフィールド区切り文字です。出力を要求すると、$22番目のフィールドである最初のパーセントカウントが出力されます0

shpr002.20201124_141036.dl.tst:\r  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0

<--          Field 1          -->  !     !    !     !  ...
                                   $2    $3   $4    $5 ...

おすすめ記事