如何在bash中通过grep获取返回值和匹配行?

时间:2016-11-17 10:22:28

标签: bash shell

我正在学习bash。我想立即通过grep得到返回值和匹配行。

if cat 'file' | grep 'match_word'; then
  match_by_grep="$(cat 'file' | grep 'match_word')"
  read a b <<< "${match_by_grep}"
fi

在上面的代码中,我使用了两次grep。我想不出如何用grep做一次。即使没有匹配的单词,我也不确定match_by_grep是否总是空的,因为cat可能会输出错误信息。

match_by_grep="$(cat 'file' | grep 'match_word')"
if [[ -n ${match_by_grep} ]]; then
  # match_by_grep may be an error message by cat.
  # So following a and b may have wrong value.
  read a b <<< "${match_by_grep}"
fi

请告诉我怎么做。非常感谢你。

3 个答案:

答案 0 :(得分:1)

您可以通过将搜索输出存储在变量中并查看它是否为空来避免重复使用grep

您的脚本版本没有双grep

#!/bin/bash

grepOutput="$(grep 'match_word' file)"

if [ ! -z "$grepOutput" ]; then
    read a b <<< "${grepOutput}"
fi

对上述脚本进行优化(您也可以删除临时变量)

#!/bin/bash

grepOutput="$(grep 'match_word' file)"

[[ ! -z "$grepOutput" ]] && (read a b <<< "${grepOutput}")

使用double-grep一次检查if-condition和一次解析搜索结果将类似于: -

#!/bin/bash

if grep -q 'match_word' file; then
    grepOutput="$(grep 'match_word' file)"
    read a b <<< "${grepOutput}"
fi

答案 1 :(得分:1)

当使用包含命令扩展的字符串分配变量时,返回代码是正在扩展的(最右边)命令的代码。

换句话说,您只需将作业用作条件:

if grepOutput="$(cat 'file' | grep 'match_word')"
then
  echo "There was a match"
  read -r a b <<< "${grepOutput}"
  (etc)
else
  echo "No match"
fi

答案 2 :(得分:0)

这是你想要达到的目标吗?

grep 'match_word' file ; echo $?

$?具有之前运行的命令的返回值 如果您想跟踪返回值,将PS1设置为$?也很有用。

参考:Bash Prompt with Last Exit Code