Linux에서 AIX로 grep 호출을 다시 작성하는 방법

Linux에서 AIX로 grep 호출을 다시 작성하는 방법

내 Linux 시스템에서는 fgrep속성을 사용하고 있습니다 -m 500 -C 0. 그러나 AIX에서는 이러한 매개변수가 표시되지 않습니다. 그럼 어떻게 다시 작성해야 할까요? fgrep 대신 awk를 사용하는 방법에 대해 읽었지만 방법을 모르겠습니다.

답변1

언급한 두 가지 옵션은 GNU grep에만 적용됩니다.

  • -m 500-- 처음 500개의 일치하는 줄 이후 읽기를 중지합니다.
  • -C 0-- 컨텍스트의 0번 줄을 인쇄합니다.

해당 동작 -C 0은 이미 기본값이므로 AIX에서 이를 에뮬레이트하기 위한 특별한 방법은 없습니다. 걱정해야 할 것은 출력을 처음 500개의 일치 항목으로 제한하는 것입니다. 한 가지 방법은 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 }
' "$@"

관련 정보