LINUX下的shell脚本-sed和awk命令
一.sed命令1.sed:stream editor :一次处理一行内容,处理时,把当前的行存储在临时缓冲区,处理完后,输送到屏幕2.sed命令参数sed [参数] '命令' filep##显示d##删除a##添加c##替换i##插入1)p:sed -n '/\:/p' /etc/fstabsed -n '/^#/p' /etc/fstabsed -n...
一.sed命令
sed是stream editor的缩写。是一个非交互式上下文编辑器
Sed的工作原理:
sed是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中(“模式空间“),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。
Sed的优势:
- Sed编辑器以批处理的方式来编辑文件,这比交互式编辑器(如vim)要快,可以快速的完成对数据的编辑修改。
- 可以单独的建立复杂的编辑脚本并作为给 sed 的命令文件,能够减少可观的键入和随之带来的错误。
Sed劣势:
相较于交互式编辑器而言,根本性的损失是缺乏相对地址(由于操作是每次一行的),和缺乏对命令如期运行的立即验证。
sed的使用:
1.sed命令参数
sed [参数] '命令' file
p ##显示
d ##删除
a ##添加
c ##替换
i ##插入
2.参数
1)-e选项(默认情况):在处理输入时,sed后面直接添加编辑命令
sed -e ‘命令’ file
sed -e 's/root/ROOT/g' /etc/passwd ##将/etc/passwd文件中root替换ROOT
一条编辑命令时,-e选项可以省略。但是当一条sed语句中执行多个编辑命令时,不可以省略。
2)-f选项:在处理输入时,使用sed脚本。将所用到的sed编辑命令写入一个文件,然后使用sed -f来读取该文件:
vim script.sed
$ cat script.sed
$ s/root/ROOT/g
$ s/bin/BIN/g
$ s/home/HOME/g
sed -f script.sed /etc/passwd
3)-n:不产生命令输入
sed -n 's/root/ROOT/g' /etc/passwd
使用-n选项不会将内容输出到屏幕上,通常结合p命令使用用来打印被匹配的行
sed -n '/^#/p' /etc/fstab ##将/etc/fstab文件中以#开头的行输出
4)-i:改变原文件内容
sed -i 's/westos/redhat/' passwd
sed -i 's/westos/redhat/g' passwd ##全局替换
二.使用sed命令进行文本处理
1)使用sed命令进行文本打印
sed -n '/\:/p' /etc/fstab
sed -n '/^#/p' /etc/fstab
sed -n '/^#/!p' /etc/fstab
sed -n '2,6p' /etc/fstab ##打印/etc/fstab中2-6行
sed -n '2,6!p' /etc/fstab ##将/etc/fstab中除了2-6行打印出来
sed -n '1~2p' /etc/fstab ##打印奇数行
sed -n '2~2p' /etc/fstab ##打印偶数行
2)使用sed命令删除行
sed使用d命令来删除文本中的特定行。
sed '/^UUID/d' /etc/fstab
sed '/^#/d' /etc/fstab
sed '/^$/d' /etc/fstab
sed '1,4d' /etc/fstab
3)使用sed命令附加文本
sed编辑器使用a命令来向数据流附加文本行,a命令会在指定行后增加一个新行。
sed '/hello/aworld' westos
sed 's/hello/hello world/g' westos
sed 's/hello/hello\nworld/g' westos
4)使用sed命令替换行
使用c可以将数据流中整行文本修改为新的行
sed '/hello/chello world' westos
5)使用sed命令插入文本
sed编辑器使用i命令来向数据流中插入文本行,i命令会在指定行前增加一个新行
sed '/hello/iworld\nwestos' westos
三.使用sed命令处理文件
1.向文件中写入数据
sed '1,2w test.txt' /etc/passwd
将数据流中的/etc/passwd中的第1,2行写入到文件test.txt中去
2.从文件中读取数据
使用r命令来将一个文本中的数据插入到数据流中
sed '3 r test.txt' /etc/passwd
将文件test.txt中内容插入到数据流第三行后面
四.awk报告生成器
1.awk处理机制:根据模式一次从文件中抽取一行文本,对这行文本进行切片(默认使用空白字符作为分隔符)
[root@server mnt]# cat test
this | is | a | file
$1 $2 $3 $4
2.awk常用变量
awk '{print FILENAME,NR}' /etc/passwd ##输出文件名,和当前操作的行号
awk -F: '{print NR,NF}' /etc/passwd ##输出每次处理的行号,以及当前以":"为分隔符的字段个数
总结:awk ‘{print “第NR行”,“有NF列”}’ /etc/passwd
awk -F 分隔符 BEGIN{}{}END{} FILENAME
BEGIN{}:读入第一行文本之前执行的语句,一般用来初始化操作
{}:逐行处理
END{}:处理完最后以行文本后执行,一般用来处理输出结果
NR #行数
NF #列数
FILENAME #文件名称本身
westos #westos变量值
“westos” #westos字符串
/bash$/ #条件
/条件1|条件2/ #条件1或者条件2
/条件1/||/条件2/ #条件1或者条件2
/条件1/&&/条件2/ #条件1并且条件2
$0 #所有的列
$1 #第一列
$2 #第二列
awk 'BEGIN { a=34;print a+10 }'
awk -F: 'BEGIN{print "REDHAT"} {print NR;print } END {print "WESTOS"}' passwd ##文件开头加REDHAT,末尾加WESTOS,打印行号和内容
awk -F: '/bash$/{print}' /etc/passwd ##输出以bash结尾的
awk -F: 'NR==3 {print}' /etc/passwd
awk -F: 'NR % 2 == 0 {print}' /etc/passwd ##偶数行
awk -F: 'NR >=3 && NR <=5 {print }' /etc/passwd
awk 'BEGIN{i=0}{i+=NF}END{print i}' linux.txt ##统计文本总字段个数
awk案例:
统计在系统中能su切换的并且用户加目录不在/home下的用户数量
awk -F : '/bash$/&& $6!~/home/ {print }' /etc/passwd
更多推荐
所有评论(0)