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

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

假设我运行命令 SayStuff

$ SayStuff

输出为

Watermelons and cucumbers

cucumbers现在。假设我想从输出中提取子字符串并将其导入到某个对象中。
我以编程方式执行此操作的方法是使用分隔符将输出拆分为数组空间并通过 引用它ArrayName[2]。我对 shell 脚本还很陌生,只能挖掘出一些半神秘的cut例子,但都没有任何意义。

有任何想法吗?

答案1

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

告诉按空格分割。-d ' '选择第三列。cut-f 3

您还可以使用awk,它已经根据空间进行拆分,并使列可用作$1、、$2...

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

答案2

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

  1. 像使用其他语言一样使用数组:

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

    声明var=()一个数组,$(command)保存命令的输出。因此,foo=( $(SayStuff) )将的输出存储SayStuff到数组中foo,然后将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
    

    使-aperl行为类似于awk,在空白处拆分行并保存到数组 中@F。然后我们打印 的最后一个元素@F$#F是 中的元素数@F)。告诉 perl 在每个语句-l中添加一个换行符,它应该逐行处理 STDIN,并且它应该运行在命令行中给出的脚本。print-n-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
    

答案3

以下是更多解释:

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

如果你想要最后的您可能应该使用的字段awk
在这种情况下,它变成:

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

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

相关内容