命令行:从输出中提取子字符串


25

说我运行命令说东西

$ SayStuff

输出是

Watermelons and cucumbers

现在。假设我cucumbers要从输出中提取子字符串,然后将其通过管道传递到某些内容中。
我将以编程方式进行此操作的方法是使用定界符Space将输出拆分为一个数组,并使用进行引用ArrayName[2]。我对Shell脚本还很陌生cut,并且仅成功地挖掘了半加密示例,但没有一个是有意义的。

有任何想法吗?

Answers:


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

-d ' '告诉cut拆就空间。-f 3选择第三列。

你也可以使用awk,这确实基于空间已经分裂,使列可作为$1$2...

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

请注意,它cut不会处理可变数量的空格awk
Zitrax '16

13

我可能会使用@slhck已经给出的选项之一,但是这里有一些其他方法可以做到这一点:

  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. 重击

    $ 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

因此,如果您需要第三个字段,并且用空格''分隔,则为

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

如果需要LAST字段,则可能应使用awk
在这种情况下,它将变为:

$ echo“西瓜和黄瓜” | awk'{print $ NF}'
黄瓜

awkNF中,是行中的字段数,因此$NF表示行中的最后一个字段。


基本上是相同的问题,但更笼统:stackoverflow.com/questions/3162385/… 是的,您可以使用其他方式,但是awk是最短的
zeridon 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.