awk:找到多个字符串并打印出来

时间:2018-09-22 18:24:47

标签: bash awk

我想在输入文件中打印出包含“数字”以及“开始”和“结束”之间的行,并在同一输出文件上打印出来。

我写了那个代码

awk -v string="number" '$0~string' Input >> Output
awk ' /start/ {flag=1;next} /end/{flag=0} flag { print $0}' Input >> Output

但是,它给了我输出的结果,而这并不是我真正想要的

number 1
number 2
start
line 7
line 8
line 9
end
start
line 14
line 15
line 16
end

虽然我想要的是

inputdata:

line 1
line 2
line 3
number 1
line 4
line 5
line6
start
line 7
line 8
line 9
end
line 10
number 2
line 11
line 12
line 13
start
line 14
line 15
line 16
end

输出:

number 1
start
line 7
line 8
line 9
end
number 2
start
line 14
line 15
line 16
end

4 个答案:

答案 0 :(得分:4)

awk:

$ awk '/number/;/start/,/end/' file

输出:

number 1
start
line 7
line 8
line 9
end
number 2
start
line 14
line 15
line 16
end

但是,解决方案中存在问题。如果起始-结束块中有number,它将被打印两次。如果数据确实如此,那么@Ravinder的解决方案就是解决方案。

答案 1 :(得分:2)

使用sed

>>> ctypes.c_int(5) * 5
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for *: 'c_long' and 'int'
>>> ctypes.c_int(5).value * 5
25

答案 2 :(得分:1)

请您尝试以下操作,这样可以避免两次打印字符串number,以防它也出现在startend之间。

awk '/start/,/end/{print;next}; /number/'  Input_file

让我们说以下是Input_file(我在其中添加了一个小的编辑内容,即在其中添加了字符串number

cat Input_file
line 1
line 2
line 3
number 1
line 4
line 5
line6
start
line 7
line 8
line 9
end
line 10
number 2
line 11
line 12
line 13
start
line 14
number 13
line 15
line 16
end


awk '/start/,/end/{print;next}; /number/'  Input_file
number 1
start
line 7
line 8
line 9
end
number 2
start
line 14
number 13
line 15
line 16
end

答案 3 :(得分:1)

就我个人而言,我永远不会使用范围表达式,因为它会使琐碎的事情的代码变得更加简短,但是当您的需求发生变化时,则需要完整的重写或重复的条件。我总是只用一个标志代替:

$ awk '/start/{f=1} f || /number/{print} /end/{f=0}' file
number 1
start
line 7
line 8
line 9
end
number 2
start
line 14
line 15
line 16
end

f适用于found,而不适用于flag-标志是变量的类型,即为变量的含义。将数字更改为其他内容,这是对您可能表示的意思的1种解释:

$ awk '/start/{f=1} f || sub(/number/,"foobar"){print} /end/{f=0}' file
foobar 1
start
line 7
line 8
line 9
end
foobar 2
start
line 14
line 15
line 16
end