我有一个这样的文件:
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
答案 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的值]
如果匹配,则存储在变量res
中。没有匹配导致空变量。如果执行复合命令(括号内的东西),第二行检查res
的内容是否为0长度。请注意,单行复合命令要求您在左大括号后面有一个空格,在结束大括号之前需要一个空格。这是区分支架扩展所必需的。当然,您总是可以将其分解为多行命令。
注意:sed命令需要用双引号来允许变量替换。你应该小心不要传递引号。