用单词作为定界符剪切命令


10

是否有基于单词的剪切命令,例如:

171212 16082784       6264 XXX     xxxxxxxx Transaction XXXXX abend ABCD. The task has terminated abnormally because of a program check. 16:08:27

我希望输出为:

171212 16082784       6264 XXX     xxxxxxxx Transaction XXXXX abend ABCD.

如何处理?


1
什么意思
赛勒斯(Cyrus)

ABCD是我想用作分隔符的词。而且,这是一个日志,和ABCD一样,我也有其他一些关键字。我想要一个一般的方法
Anony

Answers:


16

我建议:

awk -F 'ABCD' '{print $1 FS "."}' file

输出:

171212 16082784 6264 XXX xxxxxxxx交易XXXXX终止ABCD。

FS包含定界符“ ABCD”。“ ABCD”是一个正则表达式。


4

awk如果您提供-F带有要使用的单词的标志,则可以完成此工作:

$ awk -F 'test'  '{print $1;print $2}'  <<<  "onetesttwotest"                                                            
one
two

在您的特定情况下,将是:

$ awk -F 'ABCD' '{print $1,FS}' input.txt                                                                                
171212 16082784       6264 XXX     xxxxxxxx Transaction XXXXX abend  ABCD

从您的示例来看,您仅尝试打印内容,ABCD因此在此之后删除所有内容也是一种选择:

$ awk '{print substr($0,0,match($0,/ABCD/)+4);}' input.txt                                                               
171212 16082784       6264 XXX     xxxxxxxx Transaction XXXXX abend ABCD.

他们还希望保留“ ABCD”。

是的..ABCD必须在那里
Anony

我建议awk '{print gensub(/(.*ABCD\.).*/,"\\1",1)}'
甜点


2

grep 解:

grep -o '^.*ABCD\.' input.txt

正则表达式将匹配以^任何字符.重复多次*并以字符串结尾的每一行ABCD.。反斜杠\转义.了末尾的点的特殊含义。

该选项-o将告诉grep命令仅打印匹配行的匹配(非空)部分。


2

cut可以自己完成这项工作。不是基于单词,而是基于.定界符。

使用 :

cut -f 1 -d '.' input.txt | xargs -I "%" echo %.

输出量

rooney@bond-pc:~$ cat input.txt 
171212 16082784       6264 XXX     xxxxxxxx Transaction XXXXX abend ABCD. The task has terminated abnormally because of a program check. 16:08:27
rooney@bond-pc:~$ 
rooney@bond-pc:~$ cut -f 1 -d '.' input.txt | xargs -I "%" echo %.
171212 16082784       6264 XXX     xxxxxxxx Transaction XXXXX abend ABCD.

xargs在这里仅用于追加.到string的末尾ABCD

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.