Unix 使用grep或sed从文件中提取单词

Unix 使用grep或sed从文件中提取单词,unix,sed,grep,Unix,Sed,Grep,我有一个以下格式的文件: File : \\dvtbbnkapp115\nautilus\030db28a-f241-4054-a0e3-9bfa7e002535.dip was processed. Entries Found : 0 Unarchived Documents : 1 File Size : 1 K Error : The following line could not be process

我有一个以下格式的文件:

File                  : \\dvtbbnkapp115\nautilus\030db28a-f241-4054-a0e3-9bfa7e002535.dip was
 processed. 
Entries Found         : 0
Unarchived Documents  : 1 
            File Size : 1 K 

Error : The following line could not be processed.  Bad Document Type.

Error : Marketing and Contact preference change
        update||7000003735||078ef1f3-db6b-46a8-bb0d-c40bb2296ab5.pdf



File                  : \\dvtbbnkapp115\nautilus\078ef1f3-db6b-46a8-bb0d-c40bb2296ab5.dip was
 processed. 
Entries Found         : 0
Unarchived Documents  : 1 
            File Size : 1 K 

Error : The following line could not be processed.  Bad Document Type.

Error : Declined - Bureau Data (process)||7000003723|252204|2f1d71f4-052c-49f1-95cf-9ca9b4268f0c.pdf



File                  : \\dvtbbnkapp115\nautilus\2f1d71f4-052c-49f1-95cf-9ca9b4268f0c.dip was
 processed. 
Entries Found         : 0
Unarchived Documents  : 1 
            File Size : 1 K 

Error : The following line could not be processed.  Bad Document Type.

Error : Unable to call - please
        contact|40640510016710|7000003180||3e6a792f-c136-4a4b-a654-37f4476ccef8.pdf
我需要提取双管道后的pdf文件名,并将其写入文件。对于unix/sed/grep命令,我是一个新手,我已经尝试过了,但没有成功?有什么想法或例子可以用来提取上述信息吗


谢谢

如果我正确理解了您的请求,这应该可以做到:

grep -o -E "\|\|[^\|]*.pdf" < input | cut -f 3 -d "|"
grep-o-E“\\\\\\\\\\\]*.pdf”
grep查找包含双管道的行,后跟一个pdf名称。剪切基于分隔符“剪切”行,并选择第n个字段

要获取具有双管道的行上的所有pdf(不仅仅在它们之后):

grep“| |”output

编辑:在看到评论后,我认为你想要别的东西,所以我调整了答案。将这两个答案都放在简单的情况下…

这将只提取紧跟在“| |”序列之后的文件名

grep -o '||[^|]*\.pdf' YOUR_FILE | tr -d '|'

编辑:我删除了${…}以使其更具可读性。

为什么不直接通过sed发送您的输入?像这样:

sed -n -e '/\|\|.*pdf$/ { s/.*\|\|//; p; }'

如果您只想要PDF文件名,如果它们跟在双管字符后面,并且是行中的最后一个字符,请尝试此操作:

sed -n 's/.*||\([^|]*.pdf\)$/\1/p' inputfile
在您的示例中,第二个PDF文件名跟随一个单管字符,但该行上有一组较早的双管。如果文件名是不包含任何管道字符的零件,则应同时容纳两种样式的线:

sed -n 's/.*||.*|\([^|]*.pdf\)$/\1/p' inputfile
如果您的文件名仅包含十六进制数字和连字符,您可以像下面这样进行选择:

sed -n 's/.*||.*|\([[:xdigit:]-]*.pdf\)$/\1/p' inputfile
红宝石(1.9+)


我看到列出了三个PDF文件。您想要全部三个,还是只想要名字紧跟在
| |
后面的两个?您好,示例中只有3个,但可能有100个,如上所述。非常感谢,我花了一整天的时间在这件事上挠痒痒。嗨,这已经不起作用了,得到了非法的选择——等等,你之前写的非常有效。你以前的帖子是什么?谢谢你的思考。难道不可能有这样一行:update | 40640510016710 | 7000003735 | 252204 | 078ef1f3-db6b-46a8-bb0d-c40bb2296ab5.pdf那么这个解决方案将不起作用。。。
sed -n 's/.*||.*|\([[:xdigit:]-]*.pdf\)$/\1/p' inputfile
$ ruby -F'\|\|' -ane 'print $F[-1] if $_["\.pdf"] && !$F[1].include?("|") ' file
078ef1f3-db6b-46a8-bb0d-c40bb2296ab5.pdf
3e6a792f-c136-4a4b-a654-37f4476ccef8.pdf