sed [选项] '命令' 文件路径
选项 | 作用 |
---|---|
-r | 支持扩展元字符 |
-i | 写入文件,即操作会保存 |
-e | 可以指定多个命令,也可用“;”分割多个命令,按顺序执行 |
-n | 静默模式,取消默认控制台输出 |
命令 | 作用 | 例子 |
---|---|---|
a | 追加内容 | sed ‘3a Hi’ test.txt |
d | 删除 | sed ‘3,5d’ test.txt |
s | 匹配局部替换 | sed ‘s/hi/nihao/’ test.txt |
c | 匹配到的整行替换 | sed ‘2c this is a text.’ test.txt |
p | 打印,可与选项-n结合使用 | sed -rn ‘3,5p’ test.txt |
r | 读文件 | sed ‘/nihao/r test1.txt’ test.txt |
w | 写文件 | sed ‘3,5w test1.txt’ test.txt |
地址(定址)
地址用于决定对那些进行编辑。地址形式可以是数字,正则表达式,或两者的结合,正则要用“/模式/”格式
。如:
sed -r '3,+10d' test.txt ----->删除第三行和后面的十行
暂存空间
命令模式 | 作用 | 例子 |
---|---|---|
h | 将模式空间内容到的存入暂存空间(覆盖) | sed -r ‘3h’ test.txt |
H | 将模式空间内容到的存入暂存空间(追加) | sed -r ‘3H’ test.txt |
g | 将暂存空间的内容复制到模式空间(覆盖) | sed -r ‘1h;3g’ test.txt |
G | 将暂存空间的内容复制到模式空间(追加) | sed -r ‘1h;3G’ test.txt |
x | 暂存空间内容与模式空间内容互换 | sed -r ‘3h;4x’ test.txt |
sed中使用外部变量
sed -ri '4a'"$var1"
sed -ri "\$a$var1" test.txt
sed常见操作
选项 | 作用 |
---|---|
-i | ignore,忽略大小写 |
-l | 只列出匹配行所在的文件名 |
-q | quit,静默 |
-v | 反向查找,只显示不匹配的行 |
-R,-r | 递归针对目录 |
-A | after,显示匹配到行的后面指定行数 |
-B | before,显示匹配行的前面指定行数 |
-C | context,显示匹配行的前后指定行数 |
awk [options] 'commands' filenames
,与sed一样,也是一行一行(一行为一个记录)处理文件
BEGIN{} {} END{}
变量 | 作用 | 实例 |
---|---|---|
$0 | awk变量$0保存当前记录的内容 | awk ‘{print $0}’ /etc/passwd |
NR | 当前记录所在行数,每个文件都从1开始 | awk ‘{print NR,$0}’ test.txt /etc/passwd |
FNR | 当前记录所在行数,文件之间是连贯的 | awk ‘{print NR,$0}’ test.txt /etc/passwd |
NF | 当前记录的字段数 | awk ‘{print $NF}’ /etc/passwd |
FS | 输入字段分隔符 | 默认是空格或制表符,可以修改 |
OFS | 输出字段分隔符 | 默认是空格 |
RS | 输入记录分隔符,默认是换行符,即一行一个记录,依次对行处理 | awk ‘BEGIN{RS=":"} {print $0}’ /etc/passwd |
ORS | 输出记录之间的的分隔符,默认是换行符 | awk ‘BEGIN{ORS=""} {print $0}’ /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 均适用
算数运算,包括 + - * / % ^(幂)
eg : awk -F":" ‘$3 * 10 >500’ /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
注意
: