2

次のスニペットを使用して、find によって指定されたファイルのリストにある AWK コマンドの上位 10 行を出力したいと考えています。

$ find . -name "*.txt" -print -exec awk '$9 != ""'  \| head -n10 {} \;

処理中のファイル名を出力したいことにも注意してください。

しかし、なぜそのようなエラーが発生するのですか:

awk: cmd. line:2: fatal: cannot open file `|' for reading (No such file or directory)
./myfile.txt

それを行う正しい方法は何ですか?

パイプの前にバックスラッシュなしで試しました。それでもエラーが発生しました:

find: missing argument to `-exec'
head: cannot open `{}' for reading: No such file or directory
head: cannot open `;' for reading: No such file or directory
4

5 に答える 5

4

find の -exec を使用してコマンドを実行すると、パイプ演算子 (|) などの便利なシェル機能がすべて得られるわけではありません。ただし、必要に応じてサブシェルを明示的に実行することでそれらを取り戻すことができます。

探す 。-name '*.txt' -exec /bin/sh -c "{} というテキスト ファイルをエコーする | head -n 15" \;

于 2009-04-02T07:41:50.403 に答える
3

毎回最初の10行のみを出力するfindからすべてのファイルに対してAwkプログラムを実行する場合。

$ find . -name "*.txt" -print -exec awk '$9 != "" && n < 10 {print; n++}' {} \;
于 2009-04-03T14:28:08.087 に答える
1

次の方法でも実行できます。

find . -name '*txt' -print -exec awk 'BEGIN {nl=1 ;print FILENAME} $9 !="" {if (nl<11) { print $0 ; nl = nl + 1 }}' {}  \;

なしhead

于 2009-04-02T07:21:57.937 に答える
1

awkのみを使用する必要があります。

find . -name "*.txt" -print -exec awk '{if($9!=""&&n<11){print;n++}}' {} \;
于 2009-04-02T07:44:55.667 に答える