쉘 스크립트 출력에서 ​​특정 값 추출

쉘 스크립트 출력에서 ​​특정 값 추출

아래와 같이 postgres 데이터베이스의 출력이 있습니다.

datname | size ---- template1 | 6314 kB template0 | 6201 kB postgres | 7938 kB misago |
6370 kB (4 rows)

출력에는 6314, 6201 및 7938 값만 필요합니다. 어떻게 해야 하나요?

awk, grep 또는 sed가 선호됩니다.

답변1

데이터베이스 쿼리의 출력은 다음과 같습니다 db.out.

grep -oE '[0-9]+ kB' db.out

이것은 생산할 것입니다

6314 kB
6201 kB
7938 kB
6370 kB

␣kB그런 다음 마지막 줄을 제거 하고 제거하십시오.

$ grep -oE '[0-9]+ kB' db.out | sed -e 's/ kB//' -e '$d'
6314
6201
7938

한 줄에 세 개의 숫자가 있는 줄에 표시하려면 다음을 전달하십시오 paste.

$ grep -oE '[0-9]+ kB' db.out | sed -e 's/ kB//' -e '$d' | paste - - -
6314    6201    7938

답변2

해결책:

샘플 testfile콘텐츠:

datname | size ---- template1 | 6314 kB template0 | 6201 kB postgres | 7938 kB misago | 6370 kB
datname | size ---- template1 | 3000 kB template0 | 3001 kB postgres | 3002 kB misago | 6370 kB
datname | size ---- template1 | 4014 kB template0 | 4001 kB postgres | 4002 kB misago | 6370 kB

awk -F' *\\| *' '{ for(i=3;i<=5;i++) 
        printf "%s%s",substr($i,1,index($i," ")-1),(i==5? ORS:OFS) }' OFS=',' testfile

산출:

6314,6201,7938
3000,3001,3002
4014,4001,4002

----------

파일이 고정된 형식인 경우(필드 내부에 공백이 없음 template) - 사용하기 쉽습니다.자르다방법:

cut -d' ' --output-delimiter=',' -f7,11,15 <testfile

답변3

while read -r i; do
  <<< "${i}" \
  grep -P -o -e '(?<= )([0-9]*?)(?= )' |
  cut -d $'\n' -f 1-3 --output-delimiter=' '
done < 'file'

한 줄로:

while read -r i; do <<< "${i}" grep -P -o -e '(?<= )([0-9]*?)(?= )' | cut -d $'\n' -f 1-3 --output-delimiter=' '; done < 'file'

산출:

6314 6201 7938

필요한 경우 출력 구분 기호를 변경할 수 있습니다.

관련 정보