【问题标题】:Make changes to a file (sed, awk)对文件进行更改(sed、awk)
【发布时间】:2016-12-13 16:01:09
【问题描述】:

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

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.113 0008B9A4F3~ÍežG5„È&gÈe@Ÿ#•Œ'„¦åEI²6frÞõ+ã:®*ÓÓÂ"ða5»V$è~ ¼?Amµxðïej£„7‹ìËÏð‡.4 --

然后我想我可以删除第一个 (~) 之后的所有内容,以便获得所需的输出。

我是否遵循正确的程序?我应该使用 swd 还是 awk 来实现这一点?任何建议表示赞赏!

【问题讨论】:

  • 如果要删除到下一个波浪号,请使用[^~]*~ 而不是.*~。到第二个波浪号,[^~]*~[^~]*~ 等。
  • 是的,这很有帮助。谢谢!

标签: bash awk sed


【解决方案1】:

与其试图删除东西,不如保留你想要的东西?

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,但我们不需要。
  4. [0-9A-F]{12} 只是 12 位十六进制数字(大写,如果您希望小写也可以使用 `[0-9a-fA-F])

【讨论】:

  • 哦,从来没想过,哈哈!但是,是的,这肯定有效!谢谢!
【解决方案2】:

假设您的数据结构是相同的

一次使用多个字段分隔符与一个类,包括“;”和“~”。小心,不要像默认情况下单独使用空格作为分隔符那样返回不同的字段 3(和 6)

awk -F '[[:blank:]*[;~][[:blank:]]*' '/--$/ {print $1 " " $7}' YourFile

假设只有空格字符,没有制表符作为分隔符,数据行有数据

awk -F ' *[;~] *' '/--$/ {print $1 " " $7}' YourFile

【讨论】:

    猜你喜欢
    • 2012-04-17
    • 2015-08-24
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 2021-05-24
    • 1970-01-01
    相关资源
    最近更新 更多