grep/sed/awk를 사용하여 문자열 일부 추출

grep/sed/awk를 사용하여 문자열 일부 추출

다음 내용이 포함된 텍스트 파일이 있습니다.

duration:       17100
series:         2016
episode:        58
modesizes:      original: hd1=9120MB,hd2=7543MB,sd1=4872MB,high1=2833MB,low1=634MB
runtime:        285


duration:       13740
series:         2016
episode:        59
modesizes:      original: hd1=9024MB,hd2=7203MB,sd1=5104MB,high1=2950MB,low1=570MB
runtime:        229

duration, episode및 를 추출하고 싶습니다 modesizes. 출력은 다음과 같아야 합니다.

13740,59,9024MB,7203MB,5104MB,2950MB,570MB

답변1

그리고 awk:

awk '/duration|episode/{printf "%s,", $2} /modesizes/{gsub(/[^=,]+=/,"",$3); print $3}' file

설명하다:

  • /duration|episode/라인이 일치하는 경우 duration또는episode
    • printf "%s,", $2그런 다음 값으로 필드를 인쇄하십시오.
  • /modesizes/라인이 일치하면modesizes
    • gsub(/[^=,]+=/,"",$3)그런 다음 식별자와 등호를 제거하십시오.
    • print $3변경된 필드를 인쇄합니다.

입력 예제를 사용하면 다음이 인쇄됩니다.

17100,58,9120MB,7543MB,4872MB,2833MB,634MB
13740,59,9024MB,7203MB,5104MB,2950MB,570MB

답변2

grep정규 표현식이 있는 경우pcre

$ grep -oP '(duration|episode):\s*\K\d+|\d+MB' ip.txt | pr -ats, -7
17100,58,9120MB,7543MB,4872MB,2833MB,634MB
13740,59,9024MB,7203MB,5104MB,2950MB,570MB
  • (duration|episode):\s*\KForward Lookback Check duration또는 episode뒤에 :0개 이상의 공백이 옵니다. 이것은 출력의 일부가 아닙니다.
  • \d+하나 이상의 숫자
  • |\d+MB대체 패턴, 다음으로 끝나는 하나 이상의 숫자MB

pr그런 다음 ,구분 기호 및 최대 열을 사용하여 7얻은 출력 스타일을 지정합니다.

답변3

sed 솔루션:

sed -E -e \
    '/duration:/{
    N;N;N;N
    s/duration:\s*([0-9]*).*episode:\s*([0-9]*).*hd1=([0-9]*MB),hd2=([0-9]*MB),sd1=([0-9]*MB),high1=([0-9]*MB),low1=([0-9]*MB).*/\1,\2,\3,\4,\5,\6/
}' < input_file

다음과 같이 출력됩니다.

17100,58,9120MB,7543MB,4872MB,2833MB


13740,59,9024MB,7203MB,5104MB,2950MB

빈 줄을 유지합니다.

이를 원하지 않는 경우:

sed -E -n -e \
   '/duration:/{
    N;N;N;N
    s/duration:\s*([0-9]*).*episode:\s*([0-9]*).*hd1=([0-9]*MB),hd2=([0-9]*MB),sd1=([0-9]*MB),high1=([0-9]*MB),low1=([0-9]*MB).*/\1,\2,\3,\4,\5,\6/
    p
    d
}' < input_file

관련 정보