如何重写从 Linux 到 AIX 的 grep 调用

如何重写从 Linux 到 AIX 的 grep 调用

在我的 Linux 系统中,fgrep我正在使用 atributes -m 500 -C 0。但在 AIX 上我没有看到这些参数。那么我应该如何重写呢?我只是阅读使用 awk 而不是 fgrep 但我不知道如何。

答案1

您提到的两个选项特定于 GNU grep。

  • -m 500-- 在前 500 条匹配行之后停止读取
  • -C 0-- 打印输出上下文的零行

的行为-C 0已经是默认行为,因此没有什么特别需要在 AIX 上模拟它。您需要担心的是如何将输出限制为前 500 个匹配项。一种方法是通过管道传输fgrepthrough 的输出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 }
' "$@"

相关内容