在文件中找到一个字符串,然后找到包含bash的另一个字符串的上方第一行?

时间:2019-09-09 18:42:39

标签: awk grep

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

我一直在查看Tac和sed,但未能使其正常工作。

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

srv-test-1
a1
A3
srv-test-2 
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

我在下面的bash脚本中有这一行

awk -v rs="$requested" -v IGNORECASE=1 '/^srv/{ line = $0; next } $0 ~ rs { print rs" found on " line }' file

似乎并没有忽略这种情况。如果我将a1进行搜索,它将找到完美的结果。但是,如果我输入A1,则不会。我也尝试过这种方法。我也尝试过对rs变量进行硬编码,以确保它不仅仅是传递问题的变量。

awk -v rs="$requested" 'BEGIN{IGNORECASE=1}/^srv/{ line = $0; next } $0 ~ rs { print rs" found on " line }' file

它还需要取反,这样,如果用户输入b4,它将找到B4。

3 个答案:

答案 0 :(得分:2)

使用awk更加容易,与grep不同,grep不允许您在给定的定界字符上分割行或标记包含模式的行以供以后使用。 Awk是典型的瑞士陆军 TM 刀,结合了srv的能力以及更多其他功能。

只需在变量中标记以awk -v re="b1" '/^srv/{ line = $0; next } $0 ~ re { print line }' file 开头的行,并在请求的模式匹配后不久,在变量中打印最后存储的值

srv

上面打印出包含awk -v FS="|" -v re="b1" '/^srv/{ line = $1; next } $0 ~ re { print line }' file 的整行,仅对于第一列,做

..found on..

不确定,如果您还打算打印awk -v FS="|" -v re="b1" '/^srv/{ line = $1; next } $0 ~ re { print re" found on " line }' file ,但是可以这样做

awk

在回答OP有关模式不区分大小写匹配的问题时,可以使用特殊的toupper($0)变量IGNORECASE,该变量可以与其余变量一起启用。但是请注意,因为这会导致代码中的所有模式匹配都不区分大小写。仅针对特定比赛,进行tolower($0)awk -v FS="|" -v re="b1" -v IGNORECASE=1 '/^srv/{ line = $1; next } $0 ~ re { print line }' file

while( await DefaultAssetBundle
        .of(context)
        .loadString('jsonFiles/folder/file$i.json') != null) loop 

jsonDecode(await DefaultAssetBundle
        .of(context)
        .loadString('jsonFiles/folder/file1.json'));

答案 1 :(得分:2)

awk是您的朋友在这里。

awk -F'|' -v srch="$term" -v srvr="" '
    $1 ~ /^srv/{srvr=$1;next} 
    $1 == srch {print srch " found on " srvr}
' file

您可以在脚本中设置变量term,然后将其传递给awk,如下所示:

使用/输出示例

使用file中的输入文件,您将拥有:

$ term=b1; awk -F'|' -v srch="$term" -v srvr="" '
>     $1 ~ /^srv/{srvr=$1;next}
>     $1 == srch {print srch " found on " srvr}
> ' file
b1 found on srv-test-2

a1

$ term=a1; awk -F'|' -v srch="$term" -v srvr="" '
>     $1 ~ /^srv/{srvr=$1;next}
>     $1 == srch {print srch " found on " srvr}
> ' file
a1 found on srv-test-1
a1 found on srv-test-2

有很多变化,但这是基本方法。

答案 2 :(得分:1)

这是一个更简单的gnu awk版本。

将“记录选择器”设置为srv,并将其作为文本块,搜索图案并打印第一行。

awk -v f='b1' -v RS='srv' '$0~f {print f,"found in",RS$1}' file
b1 found in srv-test-2


awk -v f='a1' -v RS='srv' '$0~f {print f,"found in",RS$1}'
a1 found in srv-test-1
a1 found in srv-test-2

忽略大小写

awk -v f='a1' -v RS='srv' 'tolower($0)~f {print f,"found in",RS$1}'
a1 found in srv-test-1
a1 found in srv-test-2