
나한테 파일이 있다고 해봐
#cat file.log
abc|123|text1 modesc=bpp123 raw_info=clear
abc|123|text2 modesc=pmk123 severity=minor
abc|123|text3 modesc=pnj123 info=good
$3 인쇄에서 공백이 나올 때까지 "modesc=" 다음에 어떤 단어가 나타나는지 알고 싶습니다.
나는 그 명령의 출력이 다음과 같았으면 좋겠다고 생각합니다.
abc|123|bpp123
abc|123|pmk123
abc|123|pnj123
Bash를 사용하여 $3가 "modesc=" 다음에 오는 단어를 가져오는 위치를 인쇄하고 싶습니다. 이를 수행할 수 있는 방법이 있습니까?
답변1
$ sed 's/[^|]*modesc=\([^ ]*\).*$/\1/' file
abc|123|bpp123
abc|123|pmk123
abc|123|pnj123
이는 마지막 필드 전체를 다음 공백까지 sed
의 내용으로 바꾸는 데 사용됩니다.modesc=
$ awk -F '|' -vOFS='|' '{ sub(".*modesc=", "", $3); sub(" .*", "", $3)} 1' file
abc|123|bpp123
abc|123|pmk123
abc|123|pnj123
이 awk
프로그램은 세 번째 열을 두 개의 대체 항목으로 수정합니다. 첫 번째는 까지의 모든 것을 제거하고 modesc=
, 두 번째는 첫 번째 남은 공간 이후의 모든 것을 제거합니다. 1
끝에 lone이 있으면 awk
수정된 레코드가 인쇄됩니다(이것은 로 대체될 수 있음 { print }
).
에게오직modesc=
원본 데이터의 세 번째 열(다른 것은 아님)에서 문자열을 가져오려면 위 명령 중 하나를 사용한 다음 이를 통해 파이프 cut -d '|' -f3
하거나 다음을 사용할 수 있습니다.
sed 's/.*modesc=\([^ ]*\).*$/\1/' file
또는
awk -F '|' -vOFS='|' '{ sub(".*modesc=", "", $3); sub(" .*", "", $3); print $3 }' file
답변2
곱하기 구분 기호를 사용 하여 awk
꽤 샘플을 만들 수 있습니다.
awk -F'[|= ]' ' {print $1"|" $2"|" $5}' /tmp/file.log
위 라인에서 파이프 |
, 등가 기호 =
및 공백은 구분 기호입니다.
다음과 같이 출력 구분 기호를 명시적으로 정의할 수 있습니다.
awk -F'[|= ]' 'BEGIN { OFS="|"} {print $1,$2,$5}' /tmp/file.log
답변3
사용 awk
:
awk -F\| '{print $1"|"$2"|"gensub(/modesc=(.*) .*$/,"\\1","g",$3)}' /tmp/file.log
답변4
이는 덜 효율적이지만 작업은 다음과 잘 맞습니다 cut
.paste
paste -d '|' <(cut -d'|' -f1-2 file.log) <(cut -d'|' -f3 file.log | grep -oP 'modesc=\K\S+')