我正在尝试清理下一个文件:
1. 10.160.120.10 ; 140.0.0.40 ;Data-- 1155~00120~xtl~12/01/2016 03:00:24~000BBBBBA4FB~ÍežG5„È&gÈe@Ÿ#•Œ‘„¦åEI²6frÞõ+ã:®*ÓÓÂ"ða5»V$è~
2. ¼?Amµxðïej£„7‹ìËÏð‡.4 --
3. 10.160.120.11 ; 140.10.10.10 ;Data-- 1155~00120~xtl~12/01/2016 03:00:54~2B3BB1EB1BBB~£ˆD]†CÀ,£ÑÉ»In&Ry+/jÑ%A¡ã ÷d_#C÷—NÏÕÞ
3. Ü‚úè"åD\’c\ûñ7x°yFæï --
请注意,这些数字不是文件的实际部分。它们只是行数的参考。线的大小取决于编码的消息(这就是为什么3被重新考虑,因为它基本上是一行)。有数千条记录,但它们遵循相同的模式。每条记录都以( - )结尾。
基本上我想要实现的目的是让IP并排获得。
例如:
10.160.120.10 000BBBBBA4FB
我的第一步是删除第一个(;)和第四个(〜)之间的所有内容,因为每个记录的模式都相同。
这引导我这个。
sed 's/;.*~//'
然而,这个特殊的命令会删除所有内容,直到最后一个(〜)而不是第四个。
如果它成功地删除了第一个(;)和第四个(〜)之间的所有内容,它会让我得到这样的结果:
0.165.65.1130008B9A4F3~ÍežG5“È&amp;gÈe@Ÿ#•Œ'”|åEI²6frÞõ+ã:®*ÓÓ“ða5»V $è~ ¼?Amμxðïej£7 <ìËðð.4。
然后我猜我可以删除第一个(〜)之后的所有内容,这样我就可以获得所需的输出。
我是否遵循了正确的程序?我应该用swd还是awk来实现这个目标?任何建议表示赞赏!
答案 0 :(得分:0)
不是试图删除东西,为什么不保留你想要的东西呢?
sed -r -n 's/^[^0-9]*(([0-9]{1,3}\.){3}[0-9]{1,3}).*([0-9A-F]{12}).*$/\1 \3/p'
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^
# IP Address 12 Hex digits
说明:
\1 \3
表示输入与搜索词的第一组和第三组括号匹配的所有内容。^[^0-9]*
匹配文件开头的所有非数字([0-9]{1,3}\.){3}[0-9]{1,3}
匹配IP地址。整个术语在括号中,因为我们想保留它。内部(...)
可以在替换术语中引用为\2
,但我们不需要。{/ li>
[0-9A-F]{12}
只是12个十六进制数字(大写,如果你期望更小的情况,请使用`[0-9a-fA-F])答案 1 :(得分:0)
假设您的数据结构相同
使用包含“;”的类一次使用多个字段分隔符和“〜”。要小心,不要单独使用空格作为分隔符,默认情况下返回不同的字段3(和6)
awk -F '[[:blank:]*[;~][[:blank:]]*' '/--$/ {print $1 " " $7}' YourFile
假设只有空格字符,没有制表符作为分隔符,数据行有数据
awk -F ' *[;~] *' '/--$/ {print $1 " " $7}' YourFile