关于regex:awk:排除模式,仅匹配表达式,排序,uniq

awk: exclude pattern, match only expression, sort, uniq

我正在尝试处理500,000行文本。我的以下代码可以运行,但对我来说似乎不足。我想通过用awk完成此理论来检验该理论,以查看是否可以节省任何时间。此代码块使用各种变量通过我的脚本进行复制。在这里节省的时间等于脚本末尾节省的10倍。但是,我真的很难用awk实现这一目标。

脚本:

1
2
3
4
5
_regex_ipv4_ip_='((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])'

_regex_ipv4_cidr_='(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))'

grep -v '^#' ${tmp}/url_* | grep -Eho"${_regex_ipv4_ip_}|${_regex_ipv4_cidr_}" | sort | uniq >${tmp}/ipv4

我怎么只用awk ...
搜索多个文件。
排除的线匹配模式。
将bash变量放入awk。
使用正则表达式模拟\\'grep -o \\'。
对结果进行排序(如果只对bash中的'uniq \\'进行排序,则不必担心)
模拟uniq
将结果写入文件

输入文件看起来像这样

1
2
3
4
5
6
7
#Comment
http://192.168.0.1/whatever #Comment
192.168.0.1
http://192.168.0.1/whatever/whatever
192.168.0.1 #Comment
192.168.0.0/16
192.168.0.0/16 #Comment

删除重复项后的输出...

192.168.0.1
192.168.0.0/16

更新:1

这是我现在的位置...

这也正是我想要的方式。.

1
2
3
4
_regex_ipv4_ip_='192.168.0.1'
_regex_ipv4_cidr_='192.168.0.0/16'

awk -v exclude='#' -v include="${_regex_ipv4_ip_}" -v include2="${_regex_ipv4_cidr_}" '($0 !~ exclude) && match($0,include) && !seen[substr($0,RSTART,RLENGTH)]++ || match($0,include2) && !seen[substr($0,RSTART,RLENGTH)]++' /home/master/Desktop/t_*

但是我不能正确地将变量中包含的正则表达式正确地携带到awk中。

1
2
_regex_ipv4_ip_='((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])'
_regex_ipv4_cidr_='(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))'


您想要的东西是这样的:

1
2
3
awk -v exclude='whatever' -v include='whatever' '
($0 !~ exclude) && match($0,include) && !seen[substr($0,RSTART,RLENGTH)]++
'
file1 file2 ... fileN

,但是在您发布示例输入/输出之前,我们无法填写详细信息。