私のLinuxシステムではfgrep
属性を使用しています-m 500 -C 0
。ただし、AIXではこれらのパラメーターは表示されません。それでは、どのように書き直すべきですか? fgrepの代わりにawkを使用する方法について読んだが、方法がわからない。
答え1
上記の2つのオプションはGNU grepにのみ適用されます。
-m 500
- 最初の500行の一致行以降の読み取りを停止します。-C 0
- コンテキストの0行を印刷します。
これらの動作-C 0
はすでにデフォルト値なので、AIXでこれをエミュレートする特別な方法はありません。心配する必要があるのは、出力を最初の500の一致に制限することです。 1つの方法は、fgrep
次のように出力をパイプすることですhead
。
fgrep [options...] [files...] | head -n500
別の番号を使用する必要がある場合は、-C
同様のスクリプトを使用して作成する必要があります。 AIXにはこの機能がないawk
ため、これは正しいです。grep
ㅏエマルジョンStack Overflowにお問い合わせください。役に立つかもしれないいくつかの答えがあります。
答え2
マニュアルページには、「500行一致後に停止」がfgrep
記載されています。コンテキスト行は表示されず、-m 500
これ-C 0
はデフォルトです。
これをどのように呼び出すのか分からないので、fgrep
これがおおよそのものである可能性があることを示唆しています。
fgrep ... | head -500
答え3
このbash/awkスクリプトはgrep-C
と-m
.
#!/bin/bash
# emulate grep -m <number> -C <number> <pattern> <file>... with awk.
context=0
todo=999999
while [ $# -gt 0 ]
do case $1 in
-m) shift
todo=$1 ;;
-C) shift
context=$1 ;;
-*) echo "unsupported: $1" >&2
exit 1 ;;
*) break ;;
esac
shift
done
pattern=${1?missing pattern}
shift
awk -v context="$context" -v pat="$pattern" -v todo="$todo" '
BEGIN{ held = -1 }
{ for(i = context;i>0;i--)lb[i] = lb[i-1];
lb[0] = sprintf("%s:%d:%s",FILENAME,NR,$0);
held++;
}
$0 ~ pat && done++<todo {
if(held>context){
if(done!=1)print "--";
held = context;
}
for(i = held;i>0;i--)print lb[i];
held = -1;
max = NR+context;
}
NR<=max { print lb[0]; held = -1 }
' "$@"