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 |
,但是在您发布示例输入/输出之前,我们无法填写详细信息。