簡體   English   中英

grep awk忽略字符

[英]grep awk ignore character

我正在嘗試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;

謝謝

使用awk

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

請記住,如果你正在使用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的substr函數刪除最終字符,而不是簡單地打印$3 這是對awk手冊頁的引用:

substr(s,m,n)
從位數m開始的s的n字符子串從1開始計數。

length其參數的長度作為字符串,如果沒有參數,則為$ 0。

所以,我們需要從第一個位置(1)到$3的子串減去最后一個字符的$3個子串,所以我們需要從第一個字符到length ($3) - 1

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

應該這樣做:

$ awk  '/dhcp-server-identifier/ {print substr($3, 1, length($3) - 1)}' /var/lib/dhclients/dchclicent-eth0.leases

應該這樣做。

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

那么awk函數substr

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

關於AWK的注意事項

Awk是一個非常強大和完整的編程語言。 如果你發現自己每天都會多次使用它,你可以通過學習更多的東西(特別是正則表達式處理部分),在每天的工作流程中獲益。

資料來源: AWK手冊

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

命令說明:獲取具有'dhcp-server-identifier'的行。 按空格分割,並顯示第3選擇。 拆分';' 並告訴我第一個選擇。

hek2mgl答案是我喜歡使用的答案; 但對於初學者我通常建議比sed更簡單的工具。

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版本也很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM