对文件进行更改(sed,awk)

时间:2016-12-13 00:33:15

标签: bash awk sed

我正在尝试清理下一个文件:

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来实现这个目标?任何建议表示赞赏!

2 个答案:

答案 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. \1 \3表示输入与搜索词的第一组和第三组括号匹配的所有内容。
  2. ^[^0-9]*匹配文件开头的所有非数字
  3. ([0-9]{1,3}\.){3}[0-9]{1,3}匹配IP地址。整个术语在括号中,因为我们想保留它。内部(...)可以在替换术语中引用为\2,但我们不需要。{/ li>
  4. [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