在特定范围内剪切的 Bash 脚本



我有一个日志文件,其中包含大量收集的日志,我已经使用正则表达式制作了一个grep命令,该正则表达式输出与其匹配的行数。这是我用来输出匹配行grep命令:

grep -n -E 'START_REGEX|END_REGEX' Example.log | cut -d ':' -f 1 > ranges.txt

正则表达式是有条件的,它可以匹配特定日志的开头或其结尾,因此输出如下所示:

12
45
128
136
...

这个想法是将其用作范围源,以对日志文件从第一个数字到第二个数字进行特定切割,并将它们保存在另一个文件中。
范围由输出的耦合组成,根据示例,第一个范围12,45,第二个范围128,136
我希望在最终文件中看到第 12 to 45 行的所有文本,然后是128 to 136.我面临的问题是sed命令似乎一次只能使用一个范围。

sed -E -iTMP "$START_RANGE,$END_RANGE! d;$END_RANGEq" $FILE_NAME

有没有办法(也许是awk)在一个"周期"中做到这一点?约束:我只能使用支持的 bash 命令。

您也可以

使用 awk 语句

awk '(NR>=12 && NR<=45) || (NR>=128 && NR<=136)' file

其中,NRAwk 中的一个特殊变量,它在处理文件时跟踪行号。

举个例子,

seq 1 10 > file
cat file
1
2
3
4
5
6
7
8
9
10
awk '(NR>=1 && NR<=3) || (NR>=8 && NR<=10)' file
1
2
3
8
9
10

您还可以避免使用-v变量选项对行号进行硬编码,

awk -v start1=1 -v end1=3 -v start2=8 -v end2=10 '(NR>=start1 && NR<=end1) || (NR>=start2 && NR<=end2)' file
1
2
3
8
9
10

使用 sed 您可以执行多个范围的行,如下所示:

sed -n '12,45p;128,136p'

这将输出第 12-45 行,然后输出 128-136 行。

最新更新