初识shell文本处理工具之gawk-sed
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识shell文本处理工具之gawk-sed相关的知识,希望对你有一定的参考价值。
shell
gawk
gawk选项
- -F 指定行中分隔数据字段的字段分隔符
- -f 指定处理程序的脚本名
- -v var=value 定义gawk程序中的变量
- -mf N 指定处理数据文件中的最大行数
- -mr N 指定数据文件的最大数据行数
gawk数据字段变量
- $0 表示整个文本行
- $1 表示整个文本行中第一个数据字段
- $2 表示整个文本行中第二个数据字段
一个简单的案例
# BEGIN这是处理数据之前运行的脚本
BEGIN {
# 这是定义的变量,在以下其他阶段的脚本中也可以调用,变量的调用方式如同shell中调用变量,但是不加$符号
separator1=" "
FS=":"
print "用户名"separator1"密码"separator1"用户ID"separator1"组ID"separator1"用户全名"separator1"主目录"separator1"登录shell"separator1}
# 这是进行数据处理的脚本
{
print $1 separator1 $2 separator1 $3 separator1 $4 separator1 $5 separator1 $6 separator1 $7 separator1
}
# END这是数据处理最后要运行的脚本
END {
print "==========================THE END======================="
}
指定方式为:
[email protected]:~# gawk -f ./passwd.awk /etc/passwd
sed
替换标记
- g: 全局替换
- p: 打印替换后的行
- 数字 表明新文本将替换地挤出模式匹配的地方
- w: 将替换的结果写入到文件中
替换字符
为了防止与某些特定的字符相冲突,sed支持选择其他的字符进行分隔
sed ‘s!/bin/bash!/bin/csh‘ /etc/passwd
行寻址
- 行的数字范围
- 用文本模式来过滤出某行
行寻址的使用格式
[address]command
也可以把特定地址的多个命令放在一起
address{
command1
command2
command3
}
数字方式寻址
sed ‘2s/dog/cat/‘ data1‘
sed ‘2,21s/dog/cat/‘ data1‘
sed ‘2,$s/dog/cat/‘ data1‘
文本模式寻址
sed ‘/admin/s/dog/cat‘ data2
组合命令
[email protected]:~# sed -n ‘2{s/daemon/admin/g;s/nologin/login/p}‘ /etc/passwd
admin:x:1:1:admin:/usr/sbin:/usr/sbin/login
删除行
sed ‘d‘ data2 #删除data2中的所有记录
sed ‘3d‘ data2 #删除data2中第三行
sed ‘4,$d‘ data2 #删除data2中第四行到最后的数据
sed ‘/line 1/d‘ data2 #删除模式匹配到的行
sed ‘/1/,/2/d‘ data2 #匹配到第一个打开行删除功能,匹配到第二个执行行删除功能,并删除两个匹配到的行,如果第二个模式没有被匹配到,那么整个文件的数据都被删掉了
插入和附加文本
- insert
i
在指定行前插入一个新行 - append
a
在指定行后插入一个新行
[email protected]:~# echo "line" | sed ‘i\linedemo‘
linedemo
line
[email protected]:~# echo "line" | sed ‘a\linedemo‘
line
linedemo
但是在数据流中需要指定要插入或者要追加的位置
[email protected]:~# cat date2
line1
line2
line3
[email protected]:~# sed ‘1i\demo‘ date2
demo
line1
line2
line3
[email protected]:~# sed ‘2a\demo‘ date2
line1
line2
demo
line3
# sed ‘1i\first line‘ date2 # 总是插入在第一行
# sed ‘$a\end line‘ date2 # 总是追加在最后一行
修改行
[email protected]:~# sed ‘3c\the change line‘ date2
line1
line2
the change line
[email protected]:~# sed ‘1,$c\the change line‘ date2
the change line
[email protected]:~# sed ‘1,2c\the change line‘ date2
the change line
line3
[email protected]:~# sed ‘/line1/c\the change line‘ date2
the change line
line2
line3
转换命令
# 前面的数字与后面的字母一对一的进行转换,1映射到a
[email protected]:~# sed ‘y/123/abc/‘ date2
linea
lineb
linec
[email protected]:~# sed ‘1,2y/123/abc/‘ date2
linea
lineb
line3
回顾打印
- 小写p 用来打印文本行
- 等号= 用来打印行号
- 小写l 用来列出行
打印文本行
[email protected]:~# head -3 /etc/passwd | sed ‘p‘
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
[email protected]:~# head -3 /etc/passwd | sed -n ‘p‘
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
打印行号
[email protected]:~# head -3 /etc/passwd | sed -n ‘=‘
1
2
3
[email protected]:~# head -3 /etc/passwd | sed ‘=‘
1
root:x:0:0:root:/root:/bin/bash
2
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
3
bin:x:2:2:bin:/bin:/usr/sbin/nologin
列出行
# 注意每行最后的一个$字符
[email protected]:~# head -3 /etc/passwd | sed -n ‘l‘
root:x:0:0:root:/root:/bin/bash$
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin$
bin:x:2:2:bin:/bin:/usr/sbin/nologin$
以上是关于初识shell文本处理工具之gawk-sed的主要内容,如果未能解决你的问题,请参考以下文章