コマンドライン:出力から部分文字列を抽出する


23

コマンドSayStuffを実行するとします

$ SayStuff

そして出力は

Watermelons and cucumbers

今。cucumbers出力から部分文字列を抽出し、それを何かにパイプしたいとします。
プログラムでこれを実行する方法は、出力を区切り文字Spaceで配列に分割し、それを参照することArrayName[2]です。私はシェルスクリプトにかなり慣れていないため、半暗号のcut例を掘り下げることに成功しましたが、そのいずれも意味がありませんでした。

何か案は?

回答:


30
$ echo "Watermelons and cucumbers" | cut -d ' ' -f 3
cucumbers

-d ' '伝えcutスペースに分割します。-f 33番目の列を選択します。

また、使用することができawk、すでに宇宙に基づいて分割を行い、などの列が利用できるようにされ、$1$2、...

$ echo "Watermelons and cucumbers" | awk '{ print $3 }'
cucumbers

ただしcut、可変数のスペースは処理しないことに注意してawkください。
Zitrax

12

おそらく@slhckで既に指定されているオプションの1つを使用しますが、これを行う方法がいくつかあります。

  1. 他の言語の場合と同様に、配列を使用します。

    $ foo=( $(SayStuff) ) 
    $ echo ${foo[2]}
    cucumbers

    var=()、配列を宣言し$(command)、コマンドの出力を保存します。だから、foo=( $(SayStuff) )の出力記憶SayStuffアレイへのfoo及びyuouは、その後echoそれが有する第三の要素の${foo[2]}

  2. sed

    $ SayStuff | sed 's/.* \(.*\)/\1/'
    cucumbers

    このsedコマンドはs///、すべてを最後の単語に置き換えます()。正規表現は、スペース(.*)までのあらゆるものと一致し、最後のスペースまでのすべてと一致し、最後の単語をキャプチャし(\(.*\)ます。単語はキャプチャされているので、それをとして参照できます\1

    より単純なバージョン:

    $ SayStuff | sed 's/.* //'
    cucumbers
  3. バッシュ

    $ foo=$(SayStuff); echo ${foo##* } 
    cucumbers

    これは、bashの文字列操作機能を使用します。詳細については、こちらを参照してください。

  4. もっとbash

    $ SayStuff | while read a b c; do echo $c; done
    cucumbers
  5. Perl、もちろん、これを行うには多くの方法があります:

    $ SayStuff | perl -lane 'print $F[$#F]'
    cucumber

    -a作るには、perlのように振る舞うawk空白で行を分割し、配列に保存し、@F。次に、@F$#Fがの要素数です@F)の最後の要素を出力します。-lそれぞれに改行を追加するためのperlを伝えprint、声明-nそれはラインでSTDINラインを処理しなければならないことと-e、それはコマンドラインで指定したスクリプトを実行する必要があること。

    $ SayStuff | perl -pe 's/.* //'
    cucumber

    オプションについては上で説明しましたが、最後のスペースまですべてを削除して印刷しています(-p)。

    $ perl -le 'print $ARGV[$#ARGV]' $(SayStuff)
    cucumbers

    ここではWatermelons and cucumbers引数として渡します。perlは@ARG配列に保存するため、の最後の要素を出力し@ARGます。

  6. 策略。これはsed、スペースを改行に変換しtail、最後の行のみを印刷するために使用します。

    $ SayStuff | sed 's/ /\n/g' | tail -n 1
    cucumbers
  7. grepおよび正規表現-o。これを使用すると、一致した文字列のみが出力されます。

    $ SayStuff | grep -Po '\w+$' 
    cucumbers
  8. 不正行為

    $ SayStuff | grep -o cucumbers
    cucumbers

2

ここにもう少し説明があります:

Usage: cut OPTION... [FILE]...

Print selected parts of lines from each FILE to standard output.

   -d, --delimiter=DELIM
          use DELIM instead of TAB for field delimiter

   -f, --fields=LIST
          select only these fields;  also print any line that contains  no
          delimiter character, unless the -s option is specified

したがって、3番目のフィールドが必要であり、スペース ''で区切られている場合は、

$ echo "Watermelons and cucumbers" | cut -d ' ' -f 3  
cucumbers

あなたがしたい場合LASTフィールドを、あなたは、おそらく使用する必要がありますAWK
この場合、次のようになります。

$ echo "スイカとキュウリ" | awk '{print $ NF}'
きゅうり

ではawkNF行のフィールド数がそうである$NF行の最後のフィールドを意味します。


基本的に同じ質問はここにあるが、より一般化:stackoverflow.com/questions/3162385/... はいあなたは他の方法を使用することができますが、awkは最短で
zeridon
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.