(一)awk 和 sed 的相似点
(1)它们都使用相似的语法来调用。
(2)它们都是面向字符流的,都是从文本中一行一行的输入,并且将输入直接送到标准输出端
(3)它们都使用正则表达式进行模式匹配
(4)它们允许用户在脚本中指定指令
我可能写的不是很好,这是我写脚本经常用到的,我认为这种东西要想学好就的多想,然后慢慢积累,而且我个人的心得是更加注重从实例出发,有些东西你看到以后多想想,可能到后来你还会遇到一些很相似的东西,不知不觉就学会了。
(一)取ip,一定要注意观察我报错的地方
(1)最简单的方法
[root@localhost ding]# hostname -I #建议man hostname
192.168.43.1 #如果有俩网卡就显示两个ip
一般思路:把这行取出,把ip切出
[root@localhost ding]# ifconfig eth0 | grep 't a' | awk -F '[: ]+' '{print $4}'
192.168.43.1
举例1
[root@localhost ding]# echo 1 2 3 4 | awk '{print $4}'
4
[root@localhost ding]#
举例2
[root@localhost ding]# echo "1 2 3 4" | awk '/4/' #加上双引号当作一个整体的字符串
1 2 3 4
[root@localhost ding]# echo 1 2 3 4 #不加当作单个字符串
1 2 3 4
举例3
[root@localhost ding]# echo "{a..z}" #把{a-z}当作了一个整体
{a..z}
[root@localhost ding]# echo {a..z} | awk '{print $4}' #打印a-z中每一个
d
[root@localhost ding]# echo {a..z} | awk '{print $14}'
n
-
知识点:
(1)awk 有一个选项叫-F 用来指定分割符(=刀),可以指定一个或多个分割符,为了保证不出错建议必须用单引号引起来。
(2)当指定多个分割符时必须用'[ ]'里面来写要指定的分割符,而'+'表示匹配中括号里面的
任意一个一次或多次
(3)如果不指定默认以空白(不是空格)作为分割符,如举例1
(4)后面的但引号里面可以加'pattion {action}',一定要注意观察特点action是必须要写在{ }里面的,而pattion 必须写在‘{ }’的外面,可以只写pattion 不写action,那么就默认打印$0,打印一行。也可以只写action不写pattion,例如举例2,可以打印指定的列
(5) $0 打印一行 $1打印第一列 $2打印第二列
#### grep 't (空格)a' 表示过滤符合条件的特定某行,在ifconfig eth0 中只有一行是符合这个条件的,我这么写是有道理的,不能写成'a (空格)t ' 或 '[t (空格)a]',表达的意义完全不同
取出特定的某行,用grep是根据这行独特的特点取的,也可以用sed 或 awk
例如:
[root@localhost ding]# ifconfig eth0 | awk 'NR==2{print $0}'
inet addr:192.168.43.1 Bcast:192.168.43.255 Mask:255.255.255.0
[root@localhost ding]# ifconfig eth0 | sed -n '2p'
inet addr:192.168.43.1 Bcast:192.168.43.255 Mask:255.255.255.0
[root@localhost ding]# ifconfig eth0 |head -2 |tail -1
inet addr:192.168.43.1 Bcast:192.168.43.255 Mask:255.255.255.0
举例1
[root@localhost ding]# cat 222
Ding Xue
Ding Xue
Dingxue
[root@localhost ding]# cat 222 | awk '{print NR}'
1
2
3
[root@localhost ding]# cat 222 | awk '{print NF}'
2
2
1
[root@localhost ding]#
知识点: AWK中的NR NF FNR pattion action 是什么意思呢?就是符合前面的条件,我要做一个后面的事。 这个地方怎么用语言来表达呢? AWK 是一行一行读取,NR就是说我读取到了第几行,我就把读取到这行的行号给输出出来 NF 就是说我读取了一行,这一行有多少列,统计下输出出来 FNR 和 NR 相似用于两个文件才能看出区别。 |
取出一行的方法很多,有时候可能认为有一种方法取出来不就可以了吗?学习不在多还在精,一定要在一种问题上多思考思考。
[root@localhost ding]# ifconfig eth0 |head -2 |tail -1 |cut -d":" -f2 |cut -d" " -f1
192.168.43.1
举例1:
[root@localhost ding]# ifconfig eth0 | grep 't a' |cut -d"[: ]+" -f4
cut: 分界符必须是单个字符
请尝试执行"cut --help"来获取更多信息。
[root@localhost ding]# ifconfig eth0 | grep 't a' |cut -d":" -f4
255.255.255.0
[root@localhost ding]# echo 12345 |cut -c2
2
[root@localhost ding]# echo 12345 |cut -c2-5
2345
[root@localhost ding]# echo 12345 |cut -c-3
123
[root@localhost ding]# echo 12345 |cut -c3
3
举例3
[root@localhost ding]# cat 333
123455555
1231
12355
1242
[root@localhost ding]# cat 333|cut -c1-3
123
123
123
124
[root@localhost ding]# cat 333|cut -c3
3
3
3
4
[root@localhost ding]#
知识点 cut :cut 其实挺常用,如果你不会文本处理三剑客,cut 就相当厉害了,我平时用最多的就是 -d -f -c(最多,脚本用的比较多,也可能是我写的脚本比较怪,呵呵) (1)cut 只能支持一个分割符,不支持正则,所以他不如三剑客强大 (2)-d 用来指定分割符,-f数字 用来说明你要取以分割符为单位的哪一列 (3)-c 是相对于连续不间断的字符串来说的,例如举例2 (4)这只是只有一行,如果有多行呢? 例如举例3 |
如果用sed取就是利用查找替换
[root@localhost ding]# ifconfig eth0 |head -2 |tail -1 |sed -n 's/^.*:\(.*\) Bc.*$/\1/p'
192.168.43.1
[root@localhost ding]# ifconfig eth0 |sed -n '2p' |sed -n 's/^.*:\(.*\) Bc.*$/\1/p'
192.168.43.1
[root@localhost ding]# ifconfig eth0 |sed -n '2s/^.*:\(.*\) Bc.*$/\1/p'
192.168.43.1
举例1
[root@localhost ding]# cat 222
Ding Xue
Ding Xue
Dingxue
[root@localhost ding]# cat 222 |sed -n '2p' #观察
Ding Xue
[root@localhost ding]# cat 222 |sed '2p' #再观察
Ding Xue
Ding Xue
Ding Xue
Dingxue
[root@localhost ding]#
知识点: (1)sed -n可以看下面的注释,举个例子 。通过上面的例子有没有领悟到什么,就是说用sed处理文本的时候‘数字p’打印原来文本加匹配文本都打印出来,-n (not),否定原来文本,所以就只把匹配的打印出来的,也可以记住这个固定格式。 (2)后面的一大串都是正则的东西应该系统性总结一下,先不写了在这里,内容太多。 |
例如:替换大小写,哈哈,试错是成长的阶梯,除了红色那个其他都是我打错的,不要注重我打对的结果,更要注重我打错的结果
[root@localhost 桌面]# echo ding xue |sed -r 's/([^ ]+)/&u/g'
dingu xueu
[root@localhost 桌面]# echo ding xue |sed -r 's/([^ ]+)/\&u/g'
&u &u
[root@localhost 桌面]# echo ding xue |sed -r 's/([^ ]+)/\u&/g'
Ding Xue
[root@localhost 桌面]# echo ding xue |sed -r 's/([^ ]+)/\u&/p'
Ding xue
Ding xue
[root@localhost 桌面]# echo ding xue |sed -nr 's/([^ ]+)/\u&/p'
Ding xue
[root@localhost 桌面]# echo ding xue da mei nv |sed -nr 's/([^ ]+)/\u&/p'
Ding xue da mei nv
[root@localhost 桌面]# echo ding xue da mei nv |sed -nr 's/([^ ]+)/\u&/g'
[root@localhost 桌面]# echo ding xue da mei nv |sed -r 's/([^ ]+)/\u&/g'
Ding Xue Da Mei Nv
下面是我百度的一些常用选项:
sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,下面先了解一下sed的用法
sed命令行格式为:
sed [-nefri] ‘command’ 输入文本
常用选项:
-n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e∶直接在指令列模式上进行 sed 的动作编辑;
-f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
-r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
-i∶直接修改读取的档案内容,而不是由萤幕输出。
常用命令:
a ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
本文转自 大雪儿 51CTO博客,原文链接:http://blog.51cto.com/dingxue/1969107,如需转载请自行联系原作者