1

次の「cat」コマンドの表示行数を知るには?

cat anyfile.txt | grep anypattern

を使用| wc -lすると、コマンド出力の表示が回避されます。そして、出力を表示したままにしたい

4

6 に答える 6

1

grep を使用しながらこれを行う 1 つの方法を次に示します。

grep "anypattern" anyfile.txt | awk 'END{print NR}1'

編集: シェル変数に行数を保存するには:

方法 1:

count=$(grep "anypattern" anyfile.txt | awk 'END{print NR > "/dev/stderr"}1' 3>&1 1>&2 2>&3)

方法 2:

grep "anypattern" anyfile.txt | awk 'END{print NR > "/tmp/_temp"}1'
count=$(</tmp/_temp)
于 2013-07-29T11:18:05.340 に答える
1
grep anypattern anyfile | tee /dev/stderr | wc -l

これにより、 の出力が にパイプgrepされ、標準出力と標準エラーのtee両方に書き込まれます。最後に標準エラーが表示され、標準出力がパイプされて、行数が表示されます。stdoutstderrwc


例 :

grep stack /usr/share/dict/cracklib-small | tee /dev/stderr | wc -l

haystack
smokestack
stack
stacked
stacking
stack's
stacks
7
于 2013-07-29T11:04:22.410 に答える
0
grep anypattern anyfile.txt 1>&2 | wc -l

この式は、前のコマンドから に書き込まれたすべてのものが (fd=2) にも移動するように (fd=1)を複製するように1>&2指示します。bashstdoutstdoutstderr

リダイレクション オペレータは次のコマンドの に|由来するすべてのものを書き込むstdoutので、端末に の出力が表示されます。stdinstderr

于 2013-07-29T11:13:32.217 に答える
0

TL;DR

catコマンドはファイルを連結するため、単一のファイル ( UUOC ) に対して cat を呼び出さない限り、最初のファイルが読み取られた後は、行番号は何の意味もありません。--numberGNU cat で flag を使用すると、実際にこれを実際に見ることができます。

GNU Coreutilsの catを使用する

GNU cat を使用している場合は、--numberフラグを使用できます。例えば:

$ cat --number <(echo one) <(echo two)
     1  one
     2  two

これにより、出力ストリームの現在の行番号とともに出力が表示されます。これは完全にシーケンシャルであることに注意してください。この例では、「two」は 2 番目のファイルの最初の行ですが、連結された出力の行番号 2 です。

grep フラグを直接使用する

GNU grep を使用している場合は、ファイルのコレクションのファイル名と行番号を非常に簡単に取得できます。例えば:

$ grep --line-number --with-filename root /etc/passwd /etc/group
/etc/passwd:1:root:x:0:0:root,,,:/root:/bin/bash
/etc/group:1:root:x:0:

GNU grep は、単一のファイル、複数のファイル、およびファイル グロブを処理するため、 catはまったく必要ありません。

于 2013-07-29T11:20:58.510 に答える