【发布时间】: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
编辑
解决方案的示例输出
NUMBERICUSERNAME1 IP.AD.DR.ESS1
NUMBERICUSERNAME1 --to-source
NUMBERICUSERNAME2 IP.AD.DR.ESS2
NUMBERICUSERNAME2 --to-source
【问题讨论】:
-
您能否更具体一些并显示输入示例?目前尚不清楚您要从中提取信息的格式,这使得提出解决方案非常困难。谢谢。