以下のように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
1行に3つの数字がある行に表示するには、以下を渡します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
必要に応じて出力区切り文字を変更できます。