Как переписать вызов grep из Linux в AIX

[1175129] Если вы можете использовать [1175524]perl[1175525], то вот решение:
  • Объяснение
  • Каждый раз, когда мы видим [1175868]<Каталог[1175869], мы устанавливаем [1175870]$flag = 1[1175871].
  • Если [1175872]$flag[1175873] равен true (1 означает true в булевом контексте), то мы выталкиваем текущую запись в массив [1175874]@a[1175875].
  • Если мы видим [1175876]
  • Установите [1175886]@a[1175887] на пустой массив для обработки другого блока.
  • 1
    25.08.2015, 02:19
    3 ответа

    На странице руководства для fgrep -m 500 поясняется, что это означает «остановить после сопоставления 500 строк». -C 0 не показывает никаких строк контекста, что является значением по умолчанию.

    Не имея возможности видеть, как вы вызываете fgrep , я бы предположил, что это может быть одно приближение:

    fgrep ... | head -500
    
    1
    27.01.2020, 23:16

    Этот сценарий bash / awk будет эмулировать некоторые ограниченные случаи grep -C и -m . {{ 1}} Вы должны отредактировать его, чтобы он соответствовал вашим потребностям.

    #!/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 }
    ' "$@"
    
    1
    27.01.2020, 23:16

    Две упомянутые вами опции относятся к GNU grep.

    • -m 500 - остановить чтение после первых 500 совпадающих строк
    • -C 0 - вывести нулевые строки выходного контекста

    Поведение с -C 0 уже является поведением по умолчанию, поэтому не требуется ничего особенного для его эмуляции в AIX. Все, о чем вам нужно беспокоиться, это как ограничить вывод до первых 500 совпадений. Один из способов сделать это - перенаправить вывод из fgrep через head :

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

    Если вам нужно использовать -C с другим номером, вы верны, что вам, вероятно, потребуется написать сценарий с помощью чего-то вроде awk , поскольку в AIX grep такой возможности нет. аналогичный вопрос , заданный в Stack Overflow, на который есть несколько ответов, которые могут оказаться полезными.

    3
    27.01.2020, 23:16

    Теги

    Похожие вопросы