我有一个日志文件,其中包含大量收集的日志,我已经使用正则表达式制作了一个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
其中,NR
是 Awk
中的一个特殊变量,它在处理文件时跟踪行号。
举个例子,
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 行。