次の「cat」コマンドの表示行数を知るには?
cat anyfile.txt | grep anypattern
を使用| wc -l
すると、コマンド出力の表示が回避されます。そして、出力を表示したままにしたい
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)
grep anypattern anyfile | tee /dev/stderr | wc -l
これにより、 の出力が にパイプgrep
され、標準出力と標準エラーのtee
両方に書き込まれます。最後に標準エラーが表示され、標準出力がパイプされて、行数が表示されます。stdout
stderr
wc
例 :
grep stack /usr/share/dict/cracklib-small | tee /dev/stderr | wc -l
haystack
smokestack
stack
stacked
stacking
stack's
stacks
7
grep anypattern anyfile.txt 1>&2 | wc -l
この式は、前のコマンドから に書き込まれたすべてのものが (fd=2) にも移動するように (fd=1)を複製するように1>&2
指示します。bash
stdout
stdout
stderr
リダイレクション オペレータは次のコマンドの に|
由来するすべてのものを書き込むstdout
ので、端末に の出力が表示されます。stdin
stderr
catコマンドはファイルを連結するため、単一のファイル ( UUOC ) に対して cat を呼び出さない限り、最初のファイルが読み取られた後は、行番号は何の意味もありません。--number
GNU cat で flag を使用すると、実際にこれを実際に見ることができます。
GNU cat を使用している場合は、--number
フラグを使用できます。例えば:
$ cat --number <(echo one) <(echo two)
1 one
2 two
これにより、出力ストリームの現在の行番号とともに出力が表示されます。これは完全にシーケンシャルであることに注意してください。この例では、「two」は 2 番目のファイルの最初の行ですが、連結された出力の行番号 2 です。
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はまったく必要ありません。