grep管道搜索一个单词,而不是行

时间:2014-01-01 07:22:44

标签: bash grep pipe

出于某种原因,我不能让它只输出这一行的版本。我怀疑它与grep如何解释破折号有关。

此命令:

admin@DEV:~/TEMP$ sendemail

产生以下内容:

sendemail-1.56 by Brandon Zehm
   下面的更多输出省略了

第一行感兴趣。我正在尝试将版本存储到变量。

TESTVAR=$(sendemail | grep '\s1.56\s')

有谁看到我做错了什么?感谢

TESTVAR只是空的。即使没有TESTVAR,输出也是空的。

我也试过以下,认为这可能会奏效。

sendemail | grep '\<1.56\>'

我刚刚尝试过,编辑时我觉得还有另外一个问题。也许我没有正确处理输出。它输出整行,但我可以看到grep找到了1.56,因为它在行中突出显示它。

4 个答案:

答案 0 :(得分:2)

$ TESTVAR=$(echo 'sendemail-1.56 by Brandon Zehm' | grep -Eo '1.56')
$ echo $TESTVAR
1.56

重点是grep -Eo '1.56'

来自grep man页面:

   -E, --extended-regexp
          Interpret PATTERN as an extended regular expression (ERE, see below).  (-E is specified by POSIX.)

   -o, --only-matching
          Print  only  the  matched (non-empty) parts of a matching line, with each such part on a separate output
          line.

答案 1 :(得分:1)

您的正则表达式与版本的形式不匹配。你已经指定版本被空格包围,但在它前面你有一个破折号。

将第一个\s替换为大写形式\S或明确的字符集,它应该有用。

答案 2 :(得分:1)

我想知道:在你的例子中,你似乎知道版本(因为你grep它),所以你可以只将版本字符串分配给变量。我假设你想在那里获得任何(未知)版本字符串。 sed中的正则表达式可以是(使用POSIX字符类):

sendemail |sed -n -r  '1 s/sendemail-([[:digit:]]+\.[[:digit:]]+).*/\1/ p'

-n抑制每行的正常默认输出; -r启用扩展的正则表达式;前导1告诉sed只能在第1行工作(我假设版本出现在第一行)。我将版本号锚定到告警字符串sendemail-,以便该行中其他位置的潜在其他数字不匹配。如果程序名称在将来的版本中更改或连字符消失,那么这将不再匹配。

上面的grep解决方案和这个解决方案都有缺点,读取整个输出(如今电子邮件)可能很长。另外,grep会在程序的输出中找到包含模式的所有其他行(如果它确实是电子邮件,有人可能会用它们来讨论这个问题!)。如果它确实是第一行,那么首先通过head -1进行管道将是高效和谨慎的。

答案 3 :(得分:0)

jayadevan@jayadevan-Vostro-2520:~$ echo $sendmail
sendemail-1.56 by Brandon Zehm
jayadevan@jayadevan-Vostro-2520:~$ echo $sendmail | cut -f2 -d "-" | cut -f1 -d" "
1.56