Извлечь определенные значения из вывода в сценарии оболочки

У меня есть выходные данные из базы данных postgres

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

, как показано ниже.

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

Мне нужны только эти значения 6314, 6201 и 7938 из вывода. Как я могу это сделать?

Предпочтительнее использовать awk, grep или sed.

-1
01.09.2017, 15:21
2 ответа
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

При желании измените разделитель вывода.

0
28.01.2020, 05:12

awkрешение:

Образец 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
0
28.01.2020, 05:12

Теги

Похожие вопросы