구분 기호의 패턴 이후 내용에 대한 grep

구분 기호의 패턴 이후 내용에 대한 grep

나한테 파일이 있다고 해봐

#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+')

관련 정보