Como reescrever a chamada grep do Linux para o AIX

1

No meu sistema Linux em fgrep , estou usando os atributos -m 500 -C 0 . Mas no AIX eu não vi esses argumentos. Então, como devo reescrevê-lo? Acabei de ler para usar o awk em vez do fgrep, mas não sei como.

    
por hudi 24.08.2015 / 17:03

3 respostas

3

As duas opções que você mencionou são específicas do GNU grep.

  • -m 500 - pare de ler depois das primeiras 500 linhas correspondentes
  • -C 0 - imprime linhas zero de contexto de saída

O comportamento com -C 0 já é o comportamento padrão, portanto não há nada de especial necessário para emulá-lo no AIX. Tudo o que você precisa se preocupar é como limitar a saída para as primeiras 500 partidas. Uma maneira de fazer isso seria canalizar a saída de fgrep a head :

fgrep [options...] [files...] | head -n500

Se você precisar usar -C com algum outro número, você está certo de que provavelmente precisará criar um script com algo como awk , já que AIX grep não possui esse recurso. Uma pergunta semelhante feita no Stack Overflow tem várias respostas que podem ser úteis para você.

    
por 24.08.2015 / 18:48
1

A página do manual para fgrep explica -m 500 como significando "parar após a correspondência de 500 linhas". O -C 0 não mostra linhas de contexto, que é o padrão.

Sem poder ver como você está chamando fgrep , sugiro que essa seja uma aproximação:

fgrep ... | head -500
    
por 24.08.2015 / 18:25
1

Este script bash / awk emulará alguns casos limitados de grep -C e -m . Você deve editá-lo até que corresponda às suas necessidades.

#!/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 }
' "$@"
    
por 25.08.2015 / 14:36