我有一个大的日志文件,超过100万行。 我需要使用正则表达式来查找模式,然后开始咀嚼直到我点击另一个正则表达式。所以我最终会得到1500行。
我知道sed允许使用regexp,但它能分割文件吗?我没有使用awk的经验,但我认为这应该可以让我做我需要的。我对阅读该联机帮助页感到困惑......我会嘲笑一些例子甚至更简单的解决方案。
答案 0 :(得分:5)
在AWK和SED中你可以定义一个这样的RegEx -
AWK:在AWK中你会注意到我们没有在任何地方写print
。在AWK中(基于模式/动作语句,只要模式语句为真,print就是默认操作。因此,在下面的情况下,只要RegEx模式为真,AWK就会为我们打印它。
awk '/regex1/,/regex2/' INPUT_FILE > NEW_FILE
SED:在SED中,我们使用-n选项来禁止打印所有内容的默认行为,并使用带p
的RegEx告诉SED打印特定行。
sed -n '/regex1/,/regex2/p' INPUT_FILE > NEW_FILE
或者,您也可以提供以下单行
sed '/regex1/,/regex2/!d' INPUT_FILE > NEW_FILE
使用重定向操作符>
,您可以创建文件的子集。
对于在AWK中分割文件,如果您知道文件中的记录数(wc -l < INPUT_FILE
),那么您可以写下这样的内容 -
awk 'NR==2,NR==5' INPUT_FILE
NR是AWK的内置变量,它被设置为Record的行号。因此,如果你有一个1500行的文件,只需要前750,那么你可以做这样的事情 -
awk 'NR==1,NR==750' INPUT_FILE
如前所述,您可以但不必在AWK中提及print
。只要你的模式是真的,它就会为你做到。
虽然文件中有一百万行,但这将是一个很大的痛苦。所以下面的AWK单行应该可以解决问题。
awk '{print >("SMALL_BATCH_OF_FILES_" int((NR+2)/3))}' BIG_INPUT_FILE
这个单行将创建SMALL_BATCH_OF_FILES_,每行包含3行。您可以将其设置为舒适度。 (NR + 2/3)
<强>执行:强>
[jaypal~/Temp]$ cat BIG_INPUT_FILE
1
2
3
4
5
6
7
8
9
10
[jaypal~/Temp]$ awk '{print >("SMALL_BATCH_OF_FILES_" int((NR+2)/3))}' BIG_INPUT_FILE
[jaypal~/Temp]$ ls -lrt SMALL*
-rw-r--r-- 1 jaypalsingh staff 3 25 Nov 10:41 SMALL_BATCH_OF_FILES_4
-rw-r--r-- 1 jaypalsingh staff 6 25 Nov 10:41 SMALL_BATCH_OF_FILES_3
-rw-r--r-- 1 jaypalsingh staff 6 25 Nov 10:41 SMALL_BATCH_OF_FILES_2
-rw-r--r-- 1 jaypalsingh staff 6 25 Nov 10:41 SMALL_BATCH_OF_FILES_1
[jaypal~/Temp]$ cat SMALL_BATCH_OF_FILES_1
1
2
3
[jaypal~/Temp]$ cat SMALL_BATCH_OF_FILES_2
4
5
6
[jaypal~/Temp]$ cat SMALL_BATCH_OF_FILES_3
7
8
9
[jaypal~/Temp]$ cat SMALL_BATCH_OF_FILES_4
10
答案 1 :(得分:1)
perl -ne 'print if /start pattern/ .. /end pattern/'
将打印任何行序列,以匹配/start pattern/
的行开头,以匹配/end pattern/
的行结束。如果你想在第一个这样的阻止之后拯救,你可以使用perl -ne 'print if /start pattern/ .. 0; last if /end pattern/'
。
第一个也可以在awk中完成:/start pattern/, /end pattern/ { print }
。
第二个也可能在awk中完成,但我不知道那么多awk。
答案 2 :(得分:0)
只是已经提出建议的解决方案的一个例子
awk '/regexp1/,/regexp2/'
假设你的输入文件是
0 zzz
1 aaa
2 bbb
3 ccc
4 aaa
5 ddd
6 ccc
7 aaa
8 ddd
9 eee
10 ddd
11 zzz
命令
awk '/a/, /d/' file.txt
将提取两个子集:第1行到第5行(注意4 aaa
被忽略)和第7到第8行(注意10 ddd
被忽略)
1 aaa
2 bbb
3 ccc
4 aaa
5 ddd
7 aaa
8 ddd