在搜索某个字符串时Grep为行首

时间:2015-06-18 15:48:35

标签: bash loops

我有一个这样的文件:

1    Role A
2    Role b

我想要做的是搜索String“Role A”并在变量中返回值。

如下所示:

if grep "$i" role_info.txt
then
    <assign a variable the number associated with the string>
else
    <no search string found - do something else>
fi

6 个答案:

答案 0 :(得分:1)

如果使用制表符分隔列,则可以执行以下操作:

role='Role A'
number=$(awk -v role="$role" -F '\t' '$2==role {print $1}' role_info.txt)

如果它只是空格,请尝试改为:

role='Role A'
number=$(grep "$role" role_info.txt | cut -d' ' -f1)

无论哪种方式,您都可以检查是否找到匹配项:

if [[ -n $number ]]; then
    # number found
else
    # not found
fi

另一种选择是:

while read number role; do
    if [[ $role == 'Role A' ]]; then
        # match found
    fi
done < role_info.txt

这将更加健壮:角色必须是线上的第二个项目;它不能处于第一位。

答案 1 :(得分:0)

我为此使用awk。我可以假设数字和角色名列之间有一个标签吗?如果是的话,

awk -F'\t' '$2 == "Role A" {print $1}' role_info.txt

要获取从shell变量中搜索的模式有点棘手,因为你要混合shell变量和awk列,但是可以这样做:

pat="Role A"
awk -F'\t' "\$2 == \"$pat\" {print \$1}" role_info.txt

最后,将结果分配给另一个shell变量:

result=`awk -F'\t' "\\$2 == \"$pat\" {print \\$1}" role_info.txt`

(在最后一种情况下,您需要将``。)中的一些反斜杠加倍。

答案 2 :(得分:0)

这是一个简单的方法:

role=$(grep "Role A" foo.txt | awk '{print $1}')

然后检查角色是否已分配,检查它是否为空,如:

if [ ! -z "$role" ]; then
  echo "Role exist"
else
  echo "Role does not exist"
fi

答案 3 :(得分:0)

你可以这样做:

read -a num <<< $(grep "Role A" role_info.txt) && echo ${num[0]}

此处num是一个数组,${num[0]}包含1

或者这个:

read num dummy <<< $(grep "Role A" role_info.txt) && echo $num

此处num包含1

如果未找到匹配项,则变量num将为空。

答案 4 :(得分:0)

grep&#34;角色A&#34; role_info.txt&gt;&gt; / dev / null&amp;&amp; VAR = 1

您可以使用var值来决定。

答案 5 :(得分:0)

这个简单的sed oneliner怎么样?

res=$(sed -ne "s/^\([0-9]\+\)[[:space:]]\+${i}/\1/p" role_info.txt)
[[ -z $res ]] && { <do something else>; }

如何运作

正则表达式查找如下所示的行:

  

[行首] [数字] [至少1个空格] [变量i的值]

  • 该数字可能有多位数。也允许使用0前导数字。
  • 在这种情况下,变量周围的大括号是多余的,但我把它放在以后你想切换到类似数组的东西。

如果匹配,则存储在变量res中。没有匹配导致空变量。如果执行复合命令(括号内的东西),第二行检查res的内容是否为0长度。请注意,单行复合命令要求您在左大括号后面有一个空格,在结束大括号之前需要一个空格。这是区分支架扩展所必需的。当然,您总是可以将其分解为多行命令。

注意:sed命令需要用双引号来允许变量替换。你应该小心不要传递引号。