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를 사용하여 "modesc=" 바로 뒤에 $3라는 단어를 인쇄하고 싶습니다. 이를 수행할 수 있는 방법이 있습니까?

답변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끝에 별도의 항목을 추가하면 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+')

관련 정보