sed
stream editor:一次处理一行内容,处理时,把当前行存储在临时缓冲区,处理完后,输送到屏幕。
sed [参数] '命令' file
p ###显示
d ###删除
a ###添加
c ###替换
i ###插入
-i ###修改文件内容,不从屏幕输出
-n ###静默 无任何输出
-e ###在命令行编辑
-f ###直接写入文件
p ###显示
[root@station mnt]# vim tmp
[root@station mnt]# cat tmp
hello
test
#test
####显示以#开头的行
[root@station mnt]# sed -n '/^#/p' tmp
#test
####显示不以#开头的行
[root@station mnt]# sed -n '/^#/!p' tmp
hello
test
d ###删除
[root@station mnt]# vim tmp
####删除以#开头的行
[root@station mnt]# sed '/^#/d' tmp
hello
test
[root@station mnt]# cat tmp
hello
test
#test
上面执行结果虽然屏幕显示删除了以#开头的行,但实际上不会改变文件内容
a ###添加
####在test后换行,添加westos
[root@station mnt]# sed '/test/awestos' tmp
hello
test
westos
#test
westos
c ###替换
####将test替换为tmp输出到屏幕
[root@station mnt]# sed '/test/ctmp' tmp
hello
tmp
tmp
i ###插入
####在hello前插入westos
[root@station mnt]# sed '/hello/iwestos' tmp
westos
hello
test
#test
-i ###修改文件内容,不从屏幕输出
[root@station mnt]# sed -i '/hello/iwestos' tmp
[root@station mnt]# cat tmp
westos
hello
test
#test
例:修改http端口为8080
[root@station mnt]# vim port.sh
[root@station mnt]# cat port.sh
#!/bin/bash
yum install -y httpd &> /dev/null
sed -i "/^Listen/cListen $1" /etc/httpd/conf/httpd.conf
echo -e "Port has changed!"
echo "Now ,Port is $1!"
[root@station mnt]# sh port.sh 8080
Port has changed!
Now ,Port is 8080!
awk 报告生成器
awk处理机制:根据模式一次从文件中抽取一行文本,对这行文本进行切片(默认使用空白字符作为分隔符)
awk '{print $0}' tmp ###$0表示输出一整行
[root@station mnt]# vim tmp
[root@station mnt]# cat tmp
Please input a number!
[root@station mnt]# awk '{print $0}' tmp
Please input a number!
####显示一个字段
[root@station mnt]# awk '{print $1}' tmp
Please
####显示第二个字段
[root@station mnt]# awk '{print $2}' tmp
input
####显示两个字段
[root@station mnt]# awk '{print $1,$2}' tmp
Please input
####指定分隔符
[root@station mnt]# awk -F " " '{print $1,$2}' tmp
Please input
awk常用变量
awk '{print FILENAME,NR}' path/ ##输出文件名,和当前操作的行号
awk -F: '{print NR,NF}' path/ ##输出每次处理的行号,以及当前以":"为分隔符的字段个数
BEGIN{}: ###读入第一行文本之前执行的语句,一般用来初始化操作
{}:逐行处理
END{}: ###处理完最后以行文本后执行,一般用来处理输出结果
awk -F: 'NR % 2 == 0 {print}' /etc/passwd ##偶数行
[root@station mnt]# awk -F ":" '{print FILENAME,NR}' /etc/passwd
/etc/passwd 1
/etc/passwd 2
/etc/passwd 3
/etc/passwd 4
/etc/passwd 5
/etc/passwd 6
/etc/passwd 7
...
[root@station mnt]# awk -F ":" '{print NR,NF}' /etc/passwd
1 7
2 7
3 7
4 7
5 7
6 7
7 7
8 7
...
[root@station mnt]# awk 'BEGIN {a=1;print a+2}'
3
例1:打印/etc/passwd文件中UID<3的用户,输出用户名和UID
[root@station mnt]# awk -F: '$3 >= 0 && $3 < 3 {print $1,$3}' /etc/passwd
root 0
bin 1
daemon 2
例2:统计文本总字段数
if单分支语句
##统计登陆shell为bash的用户
[root@station mnt]# awk -F: 'BEGIN{i=0}{if($7~/bash$/){i++}}END{print i}' /etc/passwd
2
###统计UID小于等于500的用户个数
[root@station mnt]# awk -F: 'BEGIN{i=0} {if($3>=0 && $3<=500){i++}} END{print i}' /etc/passwd
31
if双分支结构
####分别统计UID小于等于500和大于500的用户个数
[root@station mnt]# awk -F: 'BEGIN{i=0;j=0} {if($3>=0 && $3<=500){i++}else{j++}} END{print i,j}' /etc/passwd
31 9