カットコマンドで最後のフィールドのみを読み取る方法はありますか?


10

スペースで区切られたコマンドcutを使用-fd ' 'して出力される、スペースで区切られた文字列があります。を使用-f <n>してフィールド番号を表示<n>できることはわかっていますが、文字列の長さがわからない場合は、最後のフィールドを表示できますか?

または、またはのようなより柔軟なテキスト編集ツールを使用する必要がありますsedawk


cutコマンドはサポートできないと思いますが、確かではありませんが、cut -d '' -f-を試してみましたか?
αғsнιη

3
それを行うためのより多くの方法:stackoverflow.com/questions/22727107/...
edwinksl

@KasiyA -nは最初n-からn番目、nから最後までで、--complement選択を逆にするオプションがあります。しかし、フィールドの数を数え、私が知る限りそれに対して行動する方法はありません。
アロニカル2016

回答:


12

いいえ、それcutはできません。次のrevような2つのコマンドを使用できます。

echo 'foo bar baz' | rev | cut -d' ' -f1 | rev

しかし、通常は使いやすいですawk

echo 'foo bar baz' | awk '{print $(NF)}'

7

シェルのみを使用してこれを行うことができます。パラメーター拡張を使用して、外部ツールは必要ありません。

${var##* }

var##*パラメータ(変数)の最初から最後のスペースまでをすべて破棄しますvar

区切り文字に空白やタブなどの空白を使用できる場合は、文字クラスを使用します[:blank:]

${var##*[[:blank:]]}

例:

$ var='foo bar spam egg'

$ echo "${var##* }"
egg


$ var=$'foo\tbar\tspam\tegg'

$ echo "$var"
foo    bar    spam    egg

$ echo "${var##*[[:blank:]]}"
egg

Severus Tuxの回答のコメントでパラメーター展開の使用について話しましたが、空の文字クラスは有用な情報です。
アロニカル2016年

4

個人的にはフロリアン・ディーシュの答えが好きです。しかし、この方法もあります。

a=$(echo "your string here" | wc -w)
echo "your string here" | cut -d' ' -f$a

説明:

wc -w単語数を与える。そしてcut最後の言葉を切り取ります

編集:

私はそれを行う別の方法を考えました:

echo "Any random string here" | tac -s' ' | head -1

正しい、しかしDELIMがスペースまたはタブで、あなたのカットでdelimが同じでない場合、これは失敗したときに、これは本当です
αғsнιη

横向きの考え方もいいですが、設定a="my string here"する場合はパラメータの拡張も使用できます${a##* }
Arronical 2016

1
はい、しかしOPはスペースで区切られた文字列を持っていると言いました。
Severus Tux 2016

2

こちらは grep

$ echo "Change is Good" | grep -o '[^ ]*$'
Good

使い方:

  • grep with -o一致する行の一致した(空でない)部分のみを出力します。
  • 正規表現は[^ ]*$、末尾からスペースが見つかるまで、すべてに一致します。

perlを使用したglenn jackmanのもう1つのライナー

$ echo "Change is Good" | perl -lane 'print $F[-1]'
Good
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.