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

Если вы хотите заменить один класс символов на другой, используйте tr .

for f in *; do
    test -f "$f" && echo mv "$f" "$( tr '[:upper:]' '[:lower:]' <<<"$f" )"
done

Сценарий переименует все файлы в текущем каталоге в строчные буквы. Каталоги будут пропущены. Удалите echo , когда вы уверены, что оно делает то, что вы хотите. Вы можете заменить [: upper:] и [: lower:] на AZ и az соответственно, если у вас есть только стандартные имена файлов ASCII. (примечание: AZ , а не [AZ] ).

В качестве альтернативы можно использовать встроенную в Bash подстановку переменных с верхнего на нижний регистр:

for f in *; do
    test -f "$f" && echo mv "$f" "${f,,}"
done
3
28.03.2017, 07:36
3 ответа

Я бы сделал это только с 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 (включите) коды ошибок, которые вы хотите распечатать, или оставьте поле пустым, чтобы включить все ошибки. ( inc = "" )

0
27.01.2020, 21:25
sed -n "/Error_code=$x/s/^[^ ]* //p" > $x_error_code.txt
1
27.01.2020, 21:25

Один 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 » из ваших строк » Код_ошибки = EEE; число = 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 ...
1
27.01.2020, 21:25

Теги

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