三剑客之一-----sed
地址(定址)
地址用于决定对那些进行编辑。地址形式可以是数字,正则表达式,或两者的结合,正则要用“/模式/”格式
。如:
- sed -r ‘3,$d’ test.txt ----->删除第三行到最后一行
- sed -r ‘3,10d’ test.txt ----->删除第三行到第十行
sed -r '3,+10d' test.txt ----->删除第三行和后面的十行
sed中使用外部变量
sed -ri ‘4a$var1’ test.txt ,单引号中的$var1不行
应该sed -ri “4a$var1” test.txt,或者sed -ri '4a'"$var1"
sed -ri “$a$var1” test.txt,会出现歧义,应该sed -ri "\$a$var1" test.txt
- sed -r ‘3s/[ \t]*#*/#/’ test.txt ----->给第三行加注释,有则不加
三剑客之一-----grep
- grep:支持基本的正则元字符
- egrep:支持扩展的元字符
- fgrep:不支持元字符,字面解释所有的字符
- 找到:返回0
没找到:返回1
找不到指定文件:2
- 选项
三剑客之一------awk
- 语法形式:
awk [options] 'commands' filenames
,与sed一样,也是一行一行(一行为一个记录)处理文件
- option:-F , 定义输入字段分隔符,默认的分隔符是空格或制表符(tab)
- commands,包括三部分:
BEGIN{} {} END{}
行处理前 行处理 行处理后
- eg: awk ‘BEGIN{print “start”} {print “ok”} END{print “end”}’ /etc/hosts
效果如下:
记录与字段相关的内部变量
- 格式化输出
- print函数,类似python中的函数,默认换行
- eg:awk -F: ‘{print “用户:” $1}’ /etc/passwd
- printf函数,类似C语言中的函数,默认不换行,-表示左对齐,默认右对齐
- eg: awk -F: ‘{printf “%-10s,%-5s,%-5s\n”,$1,$,2,$3}’ /etc/passwd
- 模式和动作
- 匹配记录(整行), eg : awk ‘/^root/’ /etc/passwd
- 匹配字段 (~,!~)eg : awk -F ‘$1 ~ /^hxd/’ /etc/passwd
- 比较表达式,包括 < , > , = , != , <= , >=
eg : awk -F":" '$3==0 ’ /etc/passwd
- 条件表达式,if else,if else if else,while,for 均适用
- awk ‘{if() {} else {}}’ filename
- awk ‘{if () {} else if () {} else {}}’ filename
- awk ‘{while () {}}’ filename
- awk ‘{for () {}}’ filename
- 算数运算,包括 + - * / % ^(幂)
- eg : awk -F":" ‘$3 * 10 >500’ /etc/passwd
- 逻辑操作符和复合模式
- $$----->逻辑与,eg : awk -F":" ‘$1 ~ /root/ && $3<=15’ /etc/passwd
- || ----->逻辑或,eg : awk -F":" ‘$1 ~ /root/ || $1 ~ /hxd/’ /etc/passwd
! ------>逻辑非,eg : awk -F":" ‘!($1 ~ /root/ || $1 ~ /hxd/)’ /etc/passwd
范围模式,eg : awk -F":" ‘/^root/,/^hxd/’ /etc/passwd ,匹配从root开始的行到hxd开始的行
- 三目运算符a?b:c , eg : awk -F ‘{print($7>$10 ? “high” $7 : “high” $10)}’ filedata
- awk内部的数组
就类似于C语言中的数组
遍历数组:awk -F":" '{ username[x++]=$1} END{for (i in username) {print username[i]} }' /etc/passwd
计数器:awk -F":" '{shells[$NF]++} END{for (i in shells) {print "shell:",i,"num:",shells[i]} }' /etc/passwd
注意
:
- awk里面这个{}里面的多条命令应用分号隔开
- 里面定义的变量输出时不需要加$