LinuxからAIXでgrep呼び出しを再構築する方法

LinuxからAIXでgrep呼び出しを再構築する方法

私の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 }
' "$@"

関連情報