如何检索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]'