![쉘 스크립트 출력에서 특정 값 추출](https://linux55.com/image/117164/%EC%89%98%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%20%EC%B6%9C%EB%A0%A5%EC%97%90%EC%84%9C%20%E2%80%8B%E2%80%8B%ED%8A%B9%EC%A0%95%20%EA%B0%92%20%EC%B6%94%EC%B6%9C.png)
아래와 같이 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
필요한 경우 출력 구분 기호를 변경할 수 있습니다.