如何解析 linux 文件中的多个字符串
how to parse multiple strings from a linux file
我有一个脚本,我想从中解析用户名和 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 ,}' 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(,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
可能是这样的:
$ awk '/common_name/ {u = substr(,2,15)}
/iptables -t nat -A POSTROUTING/ {print u, $NF}' < script
NUMERICUSERNAME IP.AD.DR.ESS
如果 /common_name/
and/or /iptables -t nat -A POSTROUTING/
正则表达式捕获不需要的行,您可以稍微改进它们以使其更具选择性。示例:
/"$common_name"\s*=\s*"[[:digit:]]{15}"/
我有一个脚本,我想从中解析用户名和 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 ,}' 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(,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
可能是这样的:
$ awk '/common_name/ {u = substr(,2,15)}
/iptables -t nat -A POSTROUTING/ {print u, $NF}' < script
NUMERICUSERNAME IP.AD.DR.ESS
如果 /common_name/
and/or /iptables -t nat -A POSTROUTING/
正则表达式捕获不需要的行,您可以稍微改进它们以使其更具选择性。示例:
/"$common_name"\s*=\s*"[[:digit:]]{15}"/