gpt4 book ai didi

linux - 无法从文件中仅 grep 10 位数字

转载 作者:可可西里 更新时间:2023-11-01 11:48:41 24 4
gpt4 key购买 nike

我无法从区域文件中准确地搜索出我想要的 10 位数字。

示例区域文件是:

> cat /var/named/test.com.db
; cPanel first:11.11.0-BETA_16994 (update_time):1468656855 Cpanel::ZoneFile::VERSION:1.3 hostname:server.test.com latest:11.56.0.13
; Zone file for test.com
$TTL 14400
test.com. 86400 IN SOA ns1.test.com. cpanel.test.com. (
2016071602 ;Serial Number
14400 ;refresh
7200 ;retry
2419200 ;expire
43200 )
; test.com. 86400 IN SOA ns1.test.com. serveralerts.test.com. ( ; Previous value removed by cPanel restore auto-merge on 20160510102706 GMT
; 2015061700 ;Serial Number ; Previous value removed by cPanel restore auto-merge on 20160510102706 GMT
; 86400 ;refresh ; Previous value removed by cPanel restore auto-merge on 20160510102706 GMT
; 7200 ;retry ; Previous value removed by cPanel restore auto-merge on 20160510102706 GMT
; 3600000 ;expire ; Previous value removed by cPanel restore auto-merge on 20160510102706 GMT
; 86400 ;minimum ; Previous value removed by cPanel restore auto-merge on 20160510102706 GMT
; ) ; Previous value removed by cPanel restore auto-merge on 20160510102706 GMT

test.com. 86400 IN NS ns1.test.com.
test.com. 86400 IN NS ns2.test.com.
; test.com. 86400 IN NS ns1.test.com. ; Previous value removed by cPanel restore auto-merge on 20160510102706 GMT
; test.com. 86400 IN NS ns2.test.com. ; Previous value removed by cPanel restore auto-merge on 20160510102706 GMT


test.com. 14400 IN A 192.168.1.100

localhost 14400 IN A 127.0.0.1

test.com. 14400 IN MX 0 test.com.

mail 14400 IN CNAME test.com.
www 14400 IN CNAME test.com.
ftp 14400 IN CNAME test.com.
webdisk 14400 IN A 192.168.1.100
cpcalendars 14400 IN A 192.168.1.100
test.com. IN TXT "v=spf1 +a +mx +ip4:192.168.1.100 ~all"

我只想在 grep 输出中看到区域文件中的当前序列号 2016071602

为此我尝试了命令:

grep -o '2016[0-9]\{6\}' /var/named/test.com.db

但它会输出所有这些垃圾。我的意思是长度超过 10 的偶数

我得到的结果是:

> grep -o '2016[0-9]\{6\}' /var/named/test.com.db                     
2016071602
2016051010
2016051010
2016051010
2016051010
2016051010
2016051010
2016051010
2016051010
2016051010

你能帮我正确地过滤掉这个吗?。一旦我能够更正这个问题,我将很乐意继续在服务器上进行质量区域更新。

最佳答案

问题是 2016[0-9]\{6\}匹配以 2016 开头的任意十位数字.它对这些数字之前或之后的内容没有限制。

尝试:

$ grep -Eo '2016[0-9]{6}[^0-9]' test.com.db 
2016071602

或者,更好的是,如果你的 grep 支持 -P ,就像在 Linux 系统上一样:

$ grep -Po '2016[0-9]{6}(?=[^0-9])' test.com.db 
2016071602

在这里,(?=[^0-9])是前瞻性的:它要求数字后面有一个非数字,但它不包含在匹配中。

或者,获取“序列号”后面的数字:

$ grep -Po '2016[0-9]{6}(?=.*Serial Number)' test.com.db 
2016071602

这就要求十位数字后面的字符必须是非数字。 ( [^0-9] 匹配任何非数字,因为 ^ 是它后面的否定。)

为确保这适用于 unicode 字体,您可能需要替换 [0-9]及其 unicode 安全替代方案:[[:digit:]] :

$ grep -Po '2016[[:digit:]]{6}(?=[^[:digit:]])' test.com.db 
2016071602

关于linux - 无法从文件中仅 grep 10 位数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38681975/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com