仅输出文本中的特定变量

时间:2014-09-23 13:41:26

标签: bash perl awk sed grep

仅输出文本中的特定变量。在那种情况下:

echo "ote -C -pname ap01 -HLS 134 -db 1 -instance 43 -log ap01"

只想从“-pname”

获取此值

检测结果:

ap01

7 个答案:

答案 0 :(得分:5)

-log需要一个字符串。该字符串可以是-pname。到目前为止,现有的解决方案无法处理并将-log参数的值视为另一个参数的开头。

如果您需要强大的解决方案,则必须重新创建解析ote执行的参数。以下是你要做的事情。

echo ... | perl -MGetopt::Long -nle'
   local @ARGV = split;
   GetOptions(\%args, "C", "pname=s", "HLS=i", "db=i", "instant=i", "log=s")
      && defined($args{pname})
         && print($args{pname});
'

答案 1 :(得分:4)

echo "ote -C -pname ap01 -HLS 134 -db 1 -instance 43 -log ap01" | \
    awk '{for (i = 1; i <= NF; i++) {if ($i == "-pname") { print $(i+1); break; } } }'

答案 2 :(得分:4)

这会处理加倍的-pname

echo "ote -C -pname ap01 -HLS 134 -db 1 -instance 43 -log ap01" |\
    perl -ne 'print ( /\s+-pname\s+([^-]\S*)/ )'

正如ikegami在下面所说,如果你碰巧想要使用破折号作为这个值的第一个字符,我唯一知道你可以确定你得到一个值而不是另一个转换的方式更复杂。一种方法是对所有已知的开关进行负向前瞻:

echo "ote -C -pname -pname -ap01- -HLS 134 -db 1 -instance 43 -log ap01" |\
    perl -ne 'print ( /\s+-pname\s+(?!-(?:pname|other|known|switches))(\S+)/ )'

答案 3 :(得分:3)

grep看看背后?

$ grep -Po '(?<=-pname )[^ ]*' <<< "ote -C -pname ap01 -HLS 134 -db 1 -instance 43 -log ap01"
ap01

由于字符串中可能有许多-pname(请参阅下面的评论),然后您可以播放&#34;使用headtail获取您想要的值。

解释

  • 这会将-P用于Perl Regex,将-o用于&#34;仅打印机器行的匹配部分&#34;。
  • (?<=-pname )是一个后视:匹配前面有-pname的字符串(注意空格)。
  • [^ ]*匹配任何字符集,直到找到空格。

答案 4 :(得分:3)

echo "ote -C -pname ap01 -HLS 134 -db 1 -instance 43 -log ap01" | \
  perl -pe '($_)= /-pname\s+([^-]\S*)/'

答案 5 :(得分:1)

您可以简单地使用(GNU)grep

$ echo "ote -C -pname ap01 -HLS 134 -pname foo -db 1 -instance 43 -log ap01" |
     grep -Po -- '-pname \K[^ ]+'
ap01

解释

-P启用Perl兼容正则表达式(PCRE),它给我们\K(意思是“丢弃与此点匹配的任何内容)。-o表示”仅打印匹配的部分这条线。因此,我们然后查找字符串-pname后跟一个空格,然后查找尽可能多的连续非空格字符([^ ]+)。由于\K,之前的所有内容都被丢弃,因为-o,只会打印匹配的部分。

只要没有任何值包含空格,这将适用于任意数量的-pname标志。

答案 6 :(得分:1)

这看起来很简单

xargs -n1 | sed -n "/-pname/,//p" | tail -n1