我正在从shell脚本中查找文本文件中的匹配项,并获得所需的输出
文本文件的格式如下:
var1 = X
var2 = X
var3 = X
var4 = BDH
我的shell脚本现在是这样的
values=$(grep -hnr -A2 "$another_value_to_match" exemple.txt | cut -d "=" -f2)
find_all_values=$(ls -d $DIR/["$values"]* | xargs -n 1 basename)
another_value_to_match是我从另一个函数中获取的变量,应包含(var1、var2、var3、var4(。find_all_values正在尝试在大文件夹中查找以(X、B、D或H(开头的子文件夹。
我的问题是,如果another_value_to_match=var4,一切都很好,工作正常,因为这是文本文件中的最后一行,但如果another_vvalue_to_match==var1或我作为输出获得的任何其他值:X X BDH。
我的问题是:无论是在文本文件的第一行还是最后一行,找到匹配项后如何停止?如果
if (another_value_to_match == var2)
values=$(grep -hnr -A2 "$another_value_to_match" exemple.txt | cut -d "=" -f2 | add_something_to_pipe)
echo $values
values == X
这个怎么样:
another_value_to_match="var1"
sed -n "/$another_value_to_match *=/{s:^.*=::;p;q}" example.txt
说明:
sed -n
-使用选项-n
运行sed
(非自动打印(/$another_value_to_match *=/
-查找包含该文本的行s:^.*=::
-删除=
(含(之前的所有内容p;q
-打印,然后退出sed
如果您需要获得最后一个值,那么运行tac
以获得相反的结果:
tac example.txt | sed -n "/$another_value_to_match *=/{s:^.*=::;p;q}"
(抱歉我英语不好(
你没有得到你所想的。指令
cut -d "=" -f2
是在"="作为参数,包括前导空格字符。你应该使用
awk -v testor="$another_value_to_match" '{ if( $1 == testor ){ print $3 } }'
或
awk -v testor="$another_value_to_match" '{ if( $1 == testor ){ print $NF } }'
为了只得到所需字符串/值的干净返回,假设该值是单个字符串。
如果值是多字符串,事情会变得更复杂,但我认为这会让你思考过程朝着正确的方向工作。