如何检索bash中的命令输出的第一个单词?

我有一个命令,例如: echo "word1 word2" 。 我想把一个pipe道( | ),并从命令得到word1。

echo "word1 word2" | ....

我不知道该怎么摆pipe。

如果你必须处理结尾的空白,Awk是一个不错的select,因为它会为你处理:

 echo " word1 word2 " | awk '{print $1;}' # Prints "word1" 

切虽然不会照顾这个:

 echo " word1 word2 " | cut -f 1 -d " " # Prints nothing/whitespace 

这里的“剪切”不会打印任何东西/空格,因为空格之前的第一个东西是另一个空格。

不需要使用外部命令。 Bash本身可以完成这项工作。 假设你从某处获得“word1 word2”并存储在一个variables中,例如

 $ string="word1 word2" $ set -- $string $ echo $1 word1 $ echo $2 word2 

现在你可以分配$ 1或$ 2等到另一个variables,如果你喜欢。

我认为一个有效的方法是使用bash数组:

 array=( $string ) # do not use quotes in order to allow word expansion echo ${array[0]} # You can retrieve any word. Index runs from 0 to length-1 

另外,你可以直接读取pipe道中的数组:

 echo "word1 word2" | while read -a array; do echo ${array[0]} ; done 
 echo "word1 word2 word3" | { read first rest ; echo $first ; } 

这具有不使用外部命令的优点并保持$ 1,$ 2等variables不变。

你可以试试awk

 echo "word1 word2" | awk '{ print $1 }' 

用awk,select你喜欢的任何单词($ 1,$ 2,…)

如果您确定没有前导空格,则可以使用bash参数replace:

 $ string="word1 word2" $ echo ${string/%\ */} word1 

注意逃离单个空间。 看到这里更多的替代模式的例子。 如果你有bash> 3.0,你也可以使用正则expression式匹配来处理前导空格 – 参见这里 :

 $ string=" word1 word2" $ [[ ${string} =~ \ *([^\ ]*) ]] $ echo ${BASH_REMATCH[1]} word1 
 echo "word1 word2" | cut -f 1 -d " " 

cut从由string“”(-d“”)分隔的字段列表中剪切第一个字段(-f 1)

read是你的朋友:

  • 如果string在一个variables中:

     string="word1 word2" read -r first _ <<< "$string" printf '%s\n' "$first" 
  • 如果你在一个pipe道工作:第一种情况:你只需要第一行的第一个字:

     printf '%s\n' "word1 word2" "line2" | { read -r first _; printf '%s\n' "$first"; } 

    第二种情况:你想每行的第一个字:

     printf '%s\n' "word1 word2" "worda wordb" | while read -r first _; do printf '%s\n' "$first"; done 

这些工作,如果有领先的空间:

 printf '%s\n' " word1 word2" | { read -r first _; printf '%s\n' "$first"; } 

这是另一个使用shell参数扩展的解决scheme。 它处理第一个单词后的多个空格。 处理第一个单词前面的空格需要一个额外的扩展。

 string='word1 word2 ' echo ${string%% *} word1 

说明

%%表示从variablesstring的右侧开始,删除* (空格后面跟随任意数量的任何其他字符)的最长匹配。

由于perl集成了awk的function,所以也可以用perl来解决:

 echo " word1 word2" | perl -lane 'print $F[0]'