Несколько входов в одной команде

У меня есть что-то вроде этого:

Error_code=1; num=5; Error_code=2; num=7; Error_code=3; num=9; Error_code=1; num=2; Error_code=2; num=5; 

, , ,

И много кодов ошибок (около 100). Предположим, что файл называется performance.log

Как я могу использовать одну команду? Каждый раз, когда код ошибки отличается. У меня есть что-то вроде этого:

 grep -i "error_code=$x;" performance.log | \ awk -F";" '{print $2}' > $x_error_code.txt 

Поэтому каждый раз переменная x является новым значением, определенным из кода ошибки, и когда коды ошибок заканчиваются, сценарий заканчивается.

3 Solutions collect form web for “Несколько входов в одной команде”

Один скрипт awk мог бы все это сделать. Это также можно сделать с помощью чистого сценария оболочки Bourne, как показано ниже:

 grep -E -o '[[:digit:]]+; num=[^;]+' performance.log \ | while IFS="; " read n num; do echo "$num" >> "${n}_error_code.txt" done 

grep часть извлекает подстроку « EEE; num=NNN » из ваших строк « Error_code=EEE; num=NNN; ». Цикл while считывает EEE и num=NNN и записывает последнее в EEE_error_code.txt

Если вас интересует только один конкретный код ошибки (EEE ниже), вы можете изменить команду grep :

 grep -E -o '\<EEE; num=[^;]+' performance.log | while ... 

Если вас интересует небольшой набор кодов ошибок (EEE1 … EEEn ниже), вы можете изменить команду grep на:

 grep -E -o '\<(EEE1|EEE2|...|EEEn); num=[^;]+' performance.log | while ... 
 sed -n "/Error_code=$x/s/^[^ ]* //p" > $x_error_code.txt 

Я бы сделал это только с awk.

Этот файл сканирует файл и генерирует один файл для каждого типа ошибки

 $ ex="";awk -F"[;=]" -v ex=$ex '{a[$2]=a[$2] "\n" $3"="$4}END{for (k in a) if (k!~ex || ex=="") print a[k] >k"error_code.txt"}' performance.log 

Если вы хотите «исключить» некоторые ошибки, вы можете соответствующим образом изменить значение переменной оболочки ex, например, ex="2|3" (исключить 2 или 3)

Контрольная работа:

 $ echo "$c" Error_code=1; num=5; Error_code=2; num=7; Error_code=3; num=9; Error_code=1; num=2; Error_code=22; num=5; $ ex="";echo "$c" |awk -F"[;=]" -v ex=$ex '{a[$2]=a[$2] "\n" $3"="$4}END{for (k in a) if (k!~ex || ex=="") print a[k],k}' num=5 num=2 1 num=7 2 num=9 3 num=5 22 $ ex="22|1";echo "$c" |awk -F"[;=]" -v ex=$ex '{a[$2]=a[$2] "\n" $3"="$4}END{for (k in a) if (k!~ex || ex=="") print a[k],k}' num=7 2 num=9 3 

С другой стороны, если вы хотите сопоставить определенные шаблоны вместо исключения шаблонов, вы можете сделать это так:

 $ inc="1";awk -F"[;=]" -v inc=$inc '{a[$2]=a[$2] "\n" $3"="$4}END{for (k in a) if (k~inc || inc=="") print a[k] >k"error_code.txt"}' performance.log 

Примените к var inc (include) коды ошибок, которые вы хотите распечатать, или оставьте пустым, чтобы включить все ошибки. ( inc="" )

  • Использование sed в сценарии оболочки с многострочными переменными
  • Запустите команду, сохраненную в переменной, чтобы эхо в файл
  • отображение PID
  • шаблон awk с переменной в скрипте bash
  • Как использовать расширенное значение переменной оболочки в имени другой переменной?
  • Объем переменных при вызове функции из find
  • имя сценария скрипта echo text name для циклизации нескольких текстов
  • Как изменить переменные
  • Как назначить вывод команды переменной без запуска команды в подоболочке?
  • Bash: Объем переменных в цикле for с использованием тройника
  • Использование eval в файле make
  • Linux и Unix - лучшая ОС в мире.