【问题标题】:how to parse multiple strings from a linux file如何从一个linux文件中解析多个字符串
【发布时间】:2022-01-25 23:12:54
【问题描述】:

我有一个脚本,我想从中解析用户名和 IP 地址。

这是一个脚本示例。此条目对所有用户都存在,脚本中大约有 2000 行。

 if [ "$common_name" = "NUMERICUSERNAME" ]; then
  if [ $(/usr/sbin/iptables -t nat -L -v | grep to: | cut -d : -f 2) = "IP.AD.DR.ESS" ] ; then
   /usr/sbin/iptables -t nat -D POSTROUTING -s $(/usr/sbin/iptables -t nat -L -v | grep IP.AD.DR.ESS | gawk '{ print $(NF-2) }') -j SNAT --to-source IP.AD.DR.ESS ;
  fi
  /usr/sbin/iptables -t nat -A POSTROUTING -s $ifconfig_pool_remote_ip -j SNAT --to-source IP.AD.DR.ESS
  fi

用户名是一个 15 位数字字符串。

我尝试使用 awk 进行解析...类似于 awk '{print $5,$25}' filename 但找不到要捕获的正确字段。

我也尝试了不同形式的 grep,但不知道如何在不导致数据错位的情况下捕获这两个字段。例如grep -oP '[0-9-]{10} [0-9:]{8}' filename 给了我所有的 IP 或所有的用户名......但我似乎无法弄清楚如何同时获得两者。

获取 NUMERICUSERNAME 的输出并匹配 IP.AD.DR.ESS 的最有效方法是什么。像这样的

NUMERICUSERNAME1 IP.AD.DR.ESS1
NUMERICUSERNAME2 IP.AD.DR.ESS2
....
NUMERICUSERNAME2000 IP.AD.DR.ESS2000

另请注意,该条目在多个位置具有 IP.AD.DR.ESS,这导致我捕获了重复项。也可以避免吗?

编辑:输出

$ awk '/common_name/ {u = substr($5,2,15)}
       /--to-source/ {print u, $(NF-1)}' < script

输出:

 IP.AD.DR.ESS1
 --to-source
 IP.AD.DR.ESS10
 --to-source
 IP.AD.DR.ESS100
 ...
 IP.AD.DR.ESS75
 --to-source
NUMERICUSERNAME IP.AD.DR.ESS76
SAMENUMERICUSERNAME --to-source
SAMENUMERICUSERNAME IP.AD.DR.ESS77

notepad++ screen capture

编辑

解决方案的示例输出

NUMBERICUSERNAME1 IP.AD.DR.ESS1
NUMBERICUSERNAME1 --to-source
NUMBERICUSERNAME2 IP.AD.DR.ESS2
NUMBERICUSERNAME2 --to-source

【问题讨论】:

  • 您能否更具体一些并显示输入示例?目前尚不清楚您要从中提取信息的格式,这使得提出解决方案非常困难。谢谢。

标签: parsing awk grep


【解决方案1】:

可能是这样的:

$ awk '/common_name/ {u = substr($5,2,15)}
       /iptables -t nat -A POSTROUTING/ {print u, $NF}' < script
NUMERICUSERNAME IP.AD.DR.ESS

如果/common_name/ 和/或/iptables -t nat -A POSTROUTING/ 正则表达式捕捉到不需要的行,您可以稍微改进它们以使其更具选择性。示例:

/"\$common_name"\s*=\s*"[[:digit:]]{15}"/

【讨论】:

  • 这似乎返回所有 IP 地址的单列,然后用两列重复该列表。第一列只有一个 NUMBERICUSERNAME,第二列是重复的 IP 地址总列表。我将在原帖中发布格式化回复
  • 这意味着您显示的示例输入并不代表您的真实输入。如果您使用示例输入测试建议的 awk 脚本,您将显示它应该会产生您所要求的内容。当然,我们无法在您未显示的不同输入上对其进行测试。
  • 示例输入是我需要收集的 581 个条目的一个实例。真正的示例只是在条目数量以及对用户名和 ip 所做的更改方面有所不同。提议的脚本是否取决于需要收集的条目数量?没有其他区别
  • 实际上第一个 if 没有对齐。如果这很重要,我会更正。
  • 不...我错过了第二个 fi 声明,如果...关闭第二个,我很抱歉,我也会添加。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-06
相关资源
最近更新 更多