bash sed / awk /用于从匹配到eof打印行的东西,除了第一行

时间:2017-06-06 19:18:49

标签: bash awk sed

我的任务应该很容易,但我没有找到答案。

我需要在文件中找到一些正则表达式并打印从第一个匹配到文件结尾的所有行,但是第一个找到了。

要查找并打印sed / awk,请执行以下操作:

awk '/regex/,0'
sed '/regex/,$p'

但我觉得很愚蠢,我不能从输出中排除第一个匹配的行。

任何提示?很确定不应该很难。我只是缺乏知识。

PS我需要完全:

  • 找到匹配正则表达式的行
  • 将此正则表达式中的所有行打印到文件末尾
  • 排除第一行

一举一动。

仅在find-n-print动作之后排除行导致更复杂的解决方案

实施例

$ cat file
11 1st Cookie
12 2nd Cookie
13 1st Dinner
14 1st Candy
15 2nd Candy
16 3rd Cookie
17 1st Cake
18 2nd Dinner
19 2nd Cake

查找并打印:

$ awk '/Dinner/,0' file
13 1st Dinner
14 1st Candy
15 2nd Candy
16 3rd Cookie
17 1st Cake
18 2nd Dinner
19 2nd Cake

我想得到什么:

14 1st Candy
15 2nd Candy
16 3rd Cookie
17 1st Cake
18 2nd Dinner
19 2nd Cake

3 个答案:

答案 0 :(得分:3)

另一种选择

awk 'f; /Dinner/{f=1}' file

14 1st Candy
15 2nd Candy
16 3rd Cookie
17 1st Cake

通常,要包括开始或结束模式,有2x2组合。

$ awk '/Start/{f=1} f; /End/{f=0}' file
Start
1
2
3
End

$ awk '/End/{f=0} f; /Start/{f=1}' file
1
2
3

$ awk '/Start/{f=1} /End/{f=0} f' file
# or
$ awk '/End/{f=0} /Start/{f=1} f' file
Start
1
2
3

$ awk 'f; /Start/{f=1} /End/{f=0}' file
# or
$ awk 'f; /End/{f=0} /Start/{f=1}' file
1
2
3
End

答案 1 :(得分:0)

尝试:

awk '/Dinner/{a=1;next} a'   Input_file

在这里寻找字符串晚餐,如果是,则创建一个名为值1的变量,下一步将跳过所有进一步的语句并避免打印其中包含晚餐字符串的特定行。然后提一个方法来检查a是否为NULL然后没有提到任何动作,所以默认情况下会打印当前行。

答案 2 :(得分:0)

这是POSIX sed版本:

$ sed -ne '/Dinner/{s///; :a' -e 'n;p;ba' -e '}' file
14 1st Candy
15 2nd Candy
16 3rd Cookie
17 1st Cake
18 2nd Dinner
19 2nd Cake

说明:

  • /pattern/所需的模式

  • s///假设您不希望输出中包含模式 - 清空模式空间。

  • :a; n; p; ba;

    • 一个循环:
      • 从input(n)获取一个新行;
      • 打印它(p);
      • 分支回标签a:a; ...; BA;

使用GNU sed:

$ sed -ne '/Dinner/{s///; :a;n;p;ba}' file