今天在看师兄写的一个安装脚本文件,虽然之前学了不少bash知识。不是太熟练,打算练练手,可是这个命令折磨了我好久。索性花点时间把它弄清楚。awk这个工具语言的难度,我是体会到了。写正则表达式的都是什么人啊。。。佩服!!!
MyIpAddr=$(ip addr | awk '/^[0-9]+: / {}; /inet.*global/ {print gensub(/(.*)\/(.*)/, "\\1", "g", $2)}'|head -1)
ip addr | awk '/^[0-9]+: / {}; /inet.*global/ {print gensub(/(.*)\/(.*)/, "\\1", "g", $2)}'|head -1
awk '/^[0-9]+: / {}; /inet.*global/ {print gensub(/(.*)\/(.*)/, "\\1", "g", $2)}'
awk [-参数 变量] 'BEGIN{初始化}条件类型1{动作1}条件类型2{动作2}。。。。END{后处理}'
条件类型1是/^[0-9]+: /,你要知道正则表达式要写在/ /双斜杠这个里面。那么他是用一个正则表达式来作为一个条件类型。动作1是{},里面是空的。
继续...
条件类型2是/inet.*global/,动作2是{print gensub(/(.*)\/(.*)/, "\\1", "g", $2)},他用这个print加上gensub函数作为动作。
关于这个分号; 分号只是起到一个分隔作用,表示分号前和分号后没有联系。
gensub(a,b,c[,d])全局替换,匹配正则表达式a, 用b替换,c为指定替换目标是第几次匹配(“g”:表示全局替换),d为指定替换目标是哪个域如$1,$2,若无d指$0,返回值为target替换后内容(未替换还是返回target原内容)与sub、gsub不同的是,target内容替换后不变。
gensub(/(.*)\/(.*)/, "\\1", "g", $2)
那么这个到底是干了什么呢?我们再来对genden做一个详细的解释:
(.*)\/(.*)
这个的意思是 括号1/括号2,括号里面有两个一模一样的正则表达式。匹配出了192.168.3.11/24“//1”
表示引用第一个括号例匹配的内容,也就是192.168.3.11,用它来替换,也就是192.168.3.11/24变成了192.168.3.11“g”
表示全局替换。$2
表示第二个域。其中inet是第一个域里面,192.168.3.11在第二个域里面,brd在第三个域里面。。。MyIpAddr="inet 192.168.3.11/24 brd 192.168.3.255 scope global"
echo ${MyIpAddr} >> test1.txt
awk '{print gensub(/(.*)\/(.*)/,"\\1","g",$2)}' test1.txt
^[0-9]+
表示匹配输入字符串开始的位置,匹配多个数字。 ^ 为匹配输入字符串的开始位置。[0-9]+匹配多个数字, [0-9] 匹配单个数字,+ 匹配一个或者多个。runoo*b
可以匹配 runob、runoob、runoooooob 等,* 号代表字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)。