나는 다음과 같은 것을 가지고 있습니다 :
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
오류 코드를 기반으로 정의된 새로운 값이며, 오류 코드가 완료되면 스크립트가 완료됩니다.
답변1
스크립트 awk
는 모든 것을 할 수 있습니다. 이는 다음과 같이 순수 Bourne 쉘 스크립트를 사용하여 수행할 수도 있습니다.
grep -E -o '[[:digit:]]+; num=[^;]+' performance.log \
| while IFS="; " read n num; do
echo "$num" >> "${n}_error_code.txt"
done
이 부분은 " " 줄에서 grep
하위 문자열 " "을 추출합니다 . while 루프는 후자를 읽고 씁니다.EEE; num=NNN
Error_code=EEE; num=NNN;
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 ...
답변2
sed -n "/Error_code=$x/s/^[^ ]* //p" > $x_error_code.txt
답변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
inc
인쇄하려는 오류 코드를 var(포함)에 적용하거나, 모든 오류를 포함하려면 공백으로 남겨두세요. ( inc=""
)