从 shell 脚本的输出中提取特定值

从 shell 脚本的输出中提取特定值

我有来自 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

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

答案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

如果需要,可以更改输出分隔符。

相关内容