在文件中查找一个字符串,然后使用 bash 找到上面包含另一个字符串的第一行

在文件中查找一个字符串,然后使用 bash 找到上面包含另一个字符串的第一行

如何在文件中找到字符串,然后找到包含其前面的“srv”的行的第一个实例。

我一直在研究 Tac 和 sed,但未能成功使其正常工作。

要搜索的输出文件看起来像

srv-test-1 | SUCCESS | rc=0 >>
a1
A3
srv-test-2 | SUCCESS | rc=0 >>
a1
b1
b2
B3
B4

该代码提示用户输入他们正在查找的字符串并将其存储到一个变量中。

我可以使用找到用户请求

tac file | grep $requested

如果用户请求 b1,我希望它返回

b1 found on srv-test-2

同样如果请求 a1 它将返回

a1 found on srv-test-1
a1 found on srv-test-2

答案1

如果您想要搜索多个项目,您可以将整个文件转换为可 grep 的条目列表。

awk '/^srv/ { c = $1 ; next } { print $0 " found on " c }'

输入文件上会给你

a1 found on srv-test-1
A3 found on srv-test-1
a1 found on srv-test-2
b1 found on srv-test-2
b2 found on srv-test-2
B3 found on srv-test-2
B4 found on srv-test-2

然后要搜索单个项目,您可以过滤以前的输出

awk '/^srv/ { c = $1 ; next } { print $0 " found on " c }' | grep '^a1'

给予

a1 found on srv-test-1
a1 found on srv-test-2

答案2

$ requested='a1'; awk '$2=="|" { s=$1 }; $1==r { print r" found on "s }' r="$requested" file
a1 found on srv-test-1
a1 found on srv-test-2

如果第二个字段为 ,则第一部分$2=="|" { s=$1 }将第一个字段 () 的内容分配srv-test-XX给变量。s|

第二部分$1==r { print r" found on "s }将第一个字段与r保存请求值的变量进行比较。如果匹配,我们打印结果。

答案3

您可以使用sed编辑器来完成此操作,如下所示:

str='a1';          #string to search
str_esc_lhs=$(printf '%s\n' "$str" | sed -e 's:[][\/.^$*]:\\&:g');# escaped var fit for use on the lhs 
S='[^[:blank:]]'; #regex for a nonwhitespace char

$ sed -e "
   /srv/,/${str_esc_lhs}/!d
   H;/srv/h;/${str_esc_lhs}/!d
   g;/./!d
   s/\\(srv-$S*\\).*\\n\\(.*\\)/\\2 FOUND ON \\1/
" input_file.txt

相关内容