在我的 Linux 系统中,fgrep
我正在使用 atributes -m 500 -C 0
。但在 AIX 上我没有看到这些参数。那么我应该如何重写呢?我只是阅读使用 awk 而不是 fgrep 但我不知道如何。
答案1
您提到的两个选项特定于 GNU grep。
-m 500
-- 在前 500 条匹配行之后停止读取-C 0
-- 打印输出上下文的零行
的行为-C 0
已经是默认行为,因此没有什么特别需要在 AIX 上模拟它。您需要担心的是如何将输出限制为前 500 个匹配项。一种方法是通过管道传输fgrep
through 的输出head
:
fgrep [options...] [files...] | head -n500
如果您需要使用-C
其他数字,您可能需要使用类似 的脚本来编写它awk
,这是正确的,因为 AIXgrep
不具备此功能。 A类似的问题在 Stack Overflow 上询问,其中有几个可能对您有帮助的答案。
答案2
手册页fgrep
解释-m 500
为“匹配 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 }
' "$@"