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