2015-04-02 109 views
-2

我需要在纯文本文件(无分隔符或列)中查找最后一次出现的字符串,并将其行号和整行保存在变量中以供以后使用我的脚本使用awk查找并保存最后一次出现的字符串

然后我需要检查是否有一个第二个字符串发生在我们刚刚找到的行之后。

我不确定如何做到这一点,我是bash磨砂膏。我不知道如何在变量中保存awk的结果,而且我不确定我需要找到最后一次出现的字符串的逻辑。任何意见/指导将是惊人的

+2

你能举一个输入和输出的例子吗? – 2015-04-02 19:11:01

+3

听起来好像你正在尝试在shell中编写一个脚本,而应该完全用awk编写脚本。 shell是一个可以调用工具的环境,而不是操纵文本的工具 - 这是awk的工作。发布示例输入文件,预期输出,以及迄今为止所做的工作。 – 2015-04-02 19:18:22

回答

1
# Remember last line on which we saw "string_to_match", and the line itself 
/string_to_match/ { last1 = NR; line=$0 } 
# Remember last line on which we saw "second_string" 
/second_string/ { last2 = NR } 
# At the end of the file, if last2 was after last1, print it. 
END { if (last2 > last1) print last2 } 

基本上只是处理反过来每次找到第一个更新last1line变量时各条线和。

同样,每次看到第一个字符串更新last2变量。

当您到达文件末尾last1将是您看到第一个字符串的最后一行。在这一点上,你可以看到第二个字符串是否在该点之后被看到。您还可以使用last1line进行所需的任何处理。

+2

OP表示字符串,而不是RE,所以它会是'index($ 0,“string_to_match”)',而不是'/ string_to_match /'等。 – 2015-04-02 19:20:14

+0

好吧,我有这个到目前为止。我假设它可以在一个awk awk索引($ 0,“string1”){last1 = NR; line = $ 0} index($ 0,“string2”){last2 = NR} END {if(last1> last2)print last1:$ last1}'inputFile'。有没有办法将last1和$ last1输出到变量中?我想在一个shell脚本中做这件事,我可以在awk – Gus 2015-04-02 19:33:09

+1

之后做一些其他的事情,但是关键是你几乎肯定会用这种完全错误的方式去尝试在单个内线shell脚本,而不是简单地写一个更简单,更清晰,简洁的awk脚本。 – 2015-04-02 19:43:24