grep awk忽略字符

时间:2013-11-28 19:26:55

标签: linux bash awk grep

我正在尝试grep“option dhcp-server-identifier”的值,即192.168.75.1;

我不确定如何忽略IP地址末尾的分号“; ”。

[root@localhost ~]# cat /var/lib/dhclient/dhclient-eth0.leases
lease {
interface "eth0";
fixed-address 192.168.75.54;
option subnet-mask 255.255.255.0;
option routers 192.168.75.1;
option dhcp-lease-time 4294967295;
option dhcp-message-type 5;
option domain-name-servers 192.168.75.1,8.8.8.8;
option dhcp-server-identifier 192.168.75.1;
option broadcast-address 192.168.75.255;
option host-name "centos-64-x86-64";
option domain-name "cs2cloud.internal";
renew 1 2081/12/15 18:43:55;
rebind 2 2132/12/30 03:09:24;
expire 6 2150/01/03 21:58:02;
}

我试过以下

grep  dhcp-server-identifier /var/lib/dhclient/dhclient-eth0.leases | awk '{print $3}' 

结果是192.168.75.1;

谢谢

6 个答案:

答案 0 :(得分:4)

使用awk

awk -F" |;" '/dhcp-server-identifier/ {print $3}' /var/lib/dhclient/dhclient-eth0.leases
192.168.75.1

答案 1 :(得分:3)

请记住,如果你正在使用awk,你可以简单地使用awk。以下是等效的:

$ grep  dhcp-server-identifier /var/lib/dhclient/dhclient-eth0.leases | awk '{print $3}'
$ awk  '/dhcp-server-identifier/ {print $3}' /var/lib/dhclients/dchclicent-eth0.leases

您的问题是分号出现在名称的末尾。我们可以使用awk的$3函数删除最终字符,而不是简单地打印substr。这是对awk手册页的引用:

  

substr(s,m,n)
  从位数m开始的s的n字符子串从1开始计算。

     

长度其参数的长度为字符串,如果没有参数则为$ 0.

所以,我们需要$3的子串从第一个位置(1)到$3的长度减去最后一个字符,所以我们需要从第一个字符转到{{1 }}:

length ($3) - 1

应该这样做:

substr($3, 1, length($3) - 1)

应该这样做。

答案 2 :(得分:2)

使用sed

sed -n 's/.*option dhcp-server-identifier \(.*\);/\1/p' file

grepegrep

grep 'option dhcp-server-identifier' file  | egrep -o '([0-9]{1,3}\.){3}[0-9]{1,3}'

输出:

192.168.75.1

答案 3 :(得分:2)

awk函数substr

怎么样?
~ $ echo "Hello My Friend!" | awk '{print substr($3,0,length($3)-1)}'
Friend

关于AWK的注意事项

Awk是一个非常强大而完整的编程语言。如果你发现自己每天都会多次使用它,那么你可以通过学习更多的东西(特别是正则表达式处理部分),在每天的bash工作流程中获益。

来源:The AWK Manual

答案 4 :(得分:1)

grep  dhcp-server-identifier /var/lib/dhclient/dhclient-eth0.leases | cut -d ' ' -f3 | cut -d';' -f1

命令说明:获取具有'dhcp-server-identifier'的行。按空格分割,并显示第3选择。拆分';'并告诉我第一个选择。

hek2mgl答案是我喜欢使用的答案;但对于初学者,我通常建议使用比sed更简单的工具。

答案 5 :(得分:0)

awk 版本:

awk -F'[ ;]' '/dhcp-server-identifier/ {print $(NF-1)}' /var/lib/dhclient/dhclient-eth0.leases

使用NF-1更安全,以防你有更多的空格。

perl 版本:

perl -ne 'print if s/^.*dhcp-server-identifier +([0-9.]+);$/$1/' /var/lib/dhclient/dhclient-eth0.leases

我认为这是最安全的1-liner。

来自 hek2mgl

sed 版本也不错。