我试图从位于两条线之间的大文件线中提取,每条线都用一定的图案标记,比如说pattern1和pattern2。 我的代码:
awk "/pattern1/{flag=1;next}/pattern2/{flag=0}flag" filename
验证一行中是否存在“pattern1”并从该行开始打印,直到找到其中存在字符串“pattern2”的后续行。
我想要做的是将字符串“pattern1”与awk开始打印的行完全匹配,并通过验证行中是否存在“pattern2”来检测awk将停止打印的行(不是确切的)匹配)。所以基本上,我想为第一个模式做精确匹配,并保持上面命令的匹配行为为第二个模式。
答案 0 :(得分:0)
awk
具有如下内置功能:
$ cat data
abcd
pattern1
xyz
pattern2
abcde
$ awk '/pattern1/,/pattern2/' data
pattern1
xyz
pattern2
sed
也有:
$ sed -n '/pattern1/,/pattern2/p' data
pattern1
xyz
pattern2
编辑:为此你必须使用某种锚点,\y
中的单词边界gawk
或者这样的开始和结束锚点:
$ cat data
abcd
pattern1 234
pattern1
xyz
pattern2
abcde
$ awk '/^pattern1$/,/pattern2/' data
pattern1
xyz
pattern2
如果您想要打印组合或不打印pattern1
/ pattern2
行,您可以使用这些:
$ awk '/^pattern1$/{flag=1} /pattern2/{flag=0}flag' data
pattern1
xyz
$ awk '/^pattern1$/{flag=1;next} /pattern2/{flag=0}flag' data
xyz
$ awk '/^pattern1$/{flag=1;next;} /pattern2/{flag=0;print}flag' data
xyz
pattern2
答案 1 :(得分:0)
这里的另一个答案符合问题中的建议:
awk 'BEGIN{flag=0} /^pattern1$/{flag=1;print;next} /pattern2/{flag=0;next} {if (flag == 1) {print}}'
第一个模式必须与整行精确匹配(使用^和$),而第二个模式可以出现在行内的任何位置。
编辑:此版本 打印出出pattern1的行。如果您不想打印它们,请替换" flag = 1; print; next" by" flag = 1; next"。
答案 2 :(得分:0)
awk 'BEGIN{flag=0} /^pattern1$/{flag=1;print;next} /pattern2/{if (flag == 1) {print}; flag=0;} {if (flag == 1) {print}}' filename
这样就可以避免打印双“pattern2”:
me:~$ awk 'BEGIN{flag=0} /^pattern1$/{flag=1;print;next} /pattern2/{if (flag == 1) {print}; flag=0;} {if (flag == 1) {print}}' a
pattern1
xyz
as pattern2 sd
me:~$ cat a
abcd
pattern1 23
pattern1
xyz
as pattern2 sd
abcde
pattern2
答案 3 :(得分:0)
没有样本输入/输出它是一个猜测,但这可能是你想要的:
awk '/pattern2/{flag=0} flag; $0=="pattern1"{flag=1}' filename
可以更有意义地写成:
awk '/end_regexp/{found=0} found; $0=="start_string"{found=1}' filename
(Nbd但命名标记flag
与命名函数function
一样有用!)
我实际上认为这可能是你真正应该使用的但是idk:
awk 'index($0,"end_string"){found=0} found; $0=="start_string"{found=1}' filename
有关使用awk查找文本的更多方法,另请参阅https://stackoverflow.com/a/18409469/1745001。