使用grep命令匹配以某个单词开头、以某个单词结尾或包含某个单词的正则表达式。

3
我需要提取文本块(在StartEnd两个词之间),包含一个其他词(id)

例如:
2014-07-01 13:26:07,760 Start
2014-07-01 13:26:07,762 id: 456456454
2014-07-01 13:26:07,763 other
2014-07-01 13:26:07,764 End
2014-07-01 13:26:07,764 aaaaaaaa
2014-07-01 13:26:07,764 bbbbbbbb
2014-07-01 13:26:07,765 Start
2014-07-01 13:26:07,765 id: 930939023
2014-07-01 13:26:07,765 something
2014-07-01 13:26:07,766 End
2014-07-01 13:26:07,766 Start
2014-07-01 13:26:07,766 id: 876542
2014-07-01 13:26:07,766 other
2014-07-01 13:26:07,767 End
2014-07-01 13:26:07,767 aaaaaaaa
2014-07-01 13:26:07,767 bbbbbbbb
2014-07-01 13:26:07,767 Start
2014-07-01 13:26:07,767 id: 930939023
2014-07-01 13:26:07,768 something
2014-07-01 13:26:07,768 End
2014-07-01 13:26:07,768 Start
2014-07-01 13:26:07,768 id: 54654
2014-07-01 13:26:07,768 something
2014-07-01 13:26:07,769 End

对于id = 930939023,输出为:
2014-07-01 13:26:07,765 Start
2014-07-01 13:26:07,765 id: 930939023
2014-07-01 13:26:07,765 something
2014-07-01 13:26:07,766 End
2014-07-01 13:26:07,767 Start
2014-07-01 13:26:07,767 id: 930939023
2014-07-01 13:26:07,768 something
2014-07-01 13:26:07,768 End
3个回答

7

以下是使用sed的选项:

sed -n '/Start/{:a;/End/!{N;ba};/930939023/!d;p}' file

说明:

sed -n '                  # Suppress default printing
    /Start/ {             # When line contains Start
        :a;               # Create a label a for loop
        /End/! {          # Until a line with End is seen
            N;            # Append the next line to pattern space
            ba            # Go back to label a and repeat
        }
        /930939023/!d;    # If the appended line contains does not contain id, delete it
        p                 # Else print it
 }' file

1
+1 非常厉害的 sed-fu — 我总有一天要学会这些工具。 :) - zx81

1
你可以使用 awk。由于脚本会变得更加复杂,建议将其存储在文件中:

extract.awk:

# Set flag if id was found
/id: 930939023/{f=1}

# On "Start" clear the buffer, reset buffer index i and reset flag
/Start/{b=$0;f=0;next}

# On "End", if the flag was set print the buffer
/End/{
    if(f){
        print b
        print
    }
}

# Append all other lines to buffer
# (Lines between start end will get cleared on next "Start")
{b=b"\n"$0}

"...并像这样执行它:"
awk -f extract.awk file

输出:

2014-07-01 13:26:07,765 Start
2014-07-01 13:26:07,765 id: 930939023
2014-07-01 13:26:07,765 something
2014-07-01 13:26:07,766 End
2014-07-01 13:26:07,767 Start
2014-07-01 13:26:07,767 id: 930939023
2014-07-01 13:26:07,768 something
2014-07-01 13:26:07,768 End

有没有办法在命令中包含“开始/结束”这些词?这些块可能有100行。 - user3798244
@hek2mgl awk 可以做到这一点。 - Avinash Raj
谢谢你的帮助! :) - user3798244

1
您可以尝试以下awk命令,
$ awk '/Start/ {f=1} /End/ {print;f=0;}f' file | awk -v RS="End" -v ORS="End" '/930939023/'
2014-07-01 13:26:07,765 Start
2014-07-01 13:26:07,765 id: 930939023
2014-07-01 13:26:07,765 something
2014-07-01 13:26:07,766 End
2014-07-01 13:26:07,767 Start
2014-07-01 13:26:07,767 id: 930939023
2014-07-01 13:26:07,768 something
2014-07-01 13:26:07,768 End

感谢您的帮助 :) - user3798244

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接