如何使用shell解析命令输出

时间:2017-09-18 11:48:37

标签: linux bash shell sh

我有一个像

这样的字符串

a=b c=d e=f g=h i=j j=k

如何解析此字符串以获取j的值?

4 个答案:

答案 0 :(得分:1)

无论j=的列数如何,这将打印任何后跟j的内容,直到即将到来的空格。

 echo "a=b c=d e=f g=h i=j j=k" |grep -oP 'j=\K[^ ]+'
 k

如果您的意思是,最后一列的值,在本例中为j=k

echo "a=b c=d e=f g=h i=j j=k" |awk '{split($NF,a,"=");print a[2]}'
k

注意:解决方案1基于regex表示j的值,而解决方案2表示最后一列的值。由您决定哪一个更符合您的要求。

或使用awk的gensub

echo "a=b c=d e=f g=h i=j j=k" |awk '{J=gensub(/.*j=([^ ]+).*/,"\\1","g");print J}'
k

或使用gawk匹配功能:

echo "a=b c=d e=f g=h i=j j=k" |awk '{match($0,/.*j=([^ ]+).*/,a);print a[1]}'
k

或使用sed回复:

echo "a=b c=d e=f g=h i=j j=k"|sed -r 's/.*j=([^ ]+).*/\1/'
k

答案 1 :(得分:0)

在bash中有很多方法可以做到这一点。更好的取决于字符串模式。

假设模式总是key=value_without_whitespace key2=value2 ...,那么可能是:

echo "a=b c=d e=f g=h i=j j=k" | grep -P -o 'j=([^ ])' | cut -d '=' -f 2

答案 2 :(得分:0)

使用awk:

awk '{ for (i=1;i<=NF;i++) { split($i,arr,"=");if (arr[1]=="j") { print arr[2] } } }' <<< "a=b c=d e=f g=h i=j j=k"

查看每个空格分隔的字段,然后进一步将字段拆分为在=上分隔的数组(arr)。如果数组的第一个下标是j,则打印第二个下标。

答案 3 :(得分:0)

使用source。将分号分隔的字符串作为文件描述符传递

source <(echo "a=b c=d e=f g=h i=j j=k" | tr ' ' ';')

echo $j

k