文字列のパス、タブ、スペースの後のgrep数

文字列のパス、タブ、スペースの後のgrep数

文字列sが与えられると

s="B /home/BL/004_010_0100.0      23      0.031"

文字列内のパス、タブ、スペースの後の数字だけを把握する方法は?

上記の文字列sから数字23を抽出したいと思います。

num=$(echo $s | grep 'B .*\t (\d*)')

ベストアンサー1

文字列をスペースで区切られたフィールドのセットとして扱います。最後から2番目のフィールドが必要です。

num=$( awk '{ print $(NF-1) }' <<<"$s" )

またはここに文字列がないシェルでは、

num=$( printf '%s\n' "$s" | awk '{ print $(NF-1) }' )

これにより、コマンド$sに文字列が入力されます。awkこのawkコマンドは、スペースで区切られた最後のフィールドから2番目のフィールドを出力します。結果はnum変数に割り当てられます。

テスト:

$ s="B /home/BL/004_010_0100.0      23      0.031"
$ num=$( awk '{ print $(NF-1) }' <<<"$s" )
$ printf 'num is "%s"\n' "$num"
num is "23"

データが$sコマンドから出た場合は、awk中間変数に保存する代わりに直接入力できます。

num=$( some-command | awk '{ print $(NF-1) }' )

grep一致するアイテムを返すツールです。ワイヤー-o(このツールの一部の実装で利用可能な非標準オプションは無視してください。)最初に、文字列の空白に基づいて文字列を複数行に変換すると、それを使用してgrep数値を選択できます。$s

$ tr -s '[:blank:]' '[\n*]' <<<"$s" | grep -x '[[:digit:]]\{1,\}'
23

ここで使用されるコマンドは、tr文字列を次から変換します。

B /home/BL/004_010_0100.0      23      0.031

入力する

B
/home/BL/004_010_0100.0
23
0.031

grepコマンドがこの行を選択しました。ただ数値で構成されます(この-xオプションは、指定されたパターンが完全な行に一致するように強制します)。明らかに、これは探している数が正の整数である場合にのみ機能します。

2番目の「フィールド」に興味があることがわかっている場合は、代わりに次のものを使用できtailますhead

$ tr -s '[:blank:]' '[\n*]' <<<"$s" | tail -n 2 | head -n 1
23

...またはsed:

$ tr -s '[:blank:]' '[\n*]' <<<"$s" | sed -n -e '${ g; p; }' -e h
23

上記のすべてのバリエーションは標準であり、移植可能です。非標準ユーティリティを使用して行を 2 回反転するcutと、最後から 2 番目のフィールドを抽出するためにも使用できます。rev

$ rev <<<"$s" | tr -s '[:blank:]' '[\t*]' | cut -f 2 | rev
23

ここでは、trすべての空白文字を置き換えるためにタブを使用します(次のように圧縮します)。一つタブ)。 cut次に、2番目のフィールドを抽出し、rev抽出されたデータを再度反転します。

おすすめ記事