sed 通过指定的正则表达式完成指定关键字的过滤、截取、修改等操作
sed '1,3d' passwd #将 passwd 的第 1-3 行删除
sed -n '/^[Rr]oot/p' passwd #查找以R或r开头且后面字符为oot的行
---不加-n则显示所有行
sed -n ‘/root/p’ passwd #打印匹配字段的行
sed '1d' passwd #默认删除第一行
sed '4,$d' passwd #默认删除第 4 行至末尾行
sed '/root/d' passwd #删除含有指定字符串的行
sed –n 's/root/Linux/p’ passwd #将所有行第一个出现的root换为Linux
sed -n 's/root/Linux/gp' passwd #将文件中所有出现的root换为Linux
sed 's/bash$/&.linux/p' passwd #将行尾为bash的行后追加.linux
sed -n 's/bash$/linux/gp' passwd #将所有行行尾为bash换为linux
sed -n '/root/,/bin/p' passwd #显示所有含有root及bin的行
sed -n '1,/adm/p' passwd #从第一行开始显示至包含adm的行
多点编辑方法
sed -e '2d' -e 's/root/linux/g' passwd #删除第二行并将所有root换为linux
sed -ne '5,6p' -e '/root/p' passwd #打印第5、6行,并打印含有root的行
sed '/root/r /etc/fstab' passwd #查找含有root的行并追加文件内容
sed '/root/w 1.txt' passwd #将含root的行>到1.txt
sed '/root/a\--linux--' passwd #含有root的行下加入"--linux--"
sed 's/root/ROOT/g' passwd #将所有小写的root改为大写
sed ‘y/root/ROOT/’ passwd #将r、o、o、t字符分别换为R、O、O、T
替换
1. sed替换的基本语法为:
sed 's/原字符串/替换字符串/'
单引号里面,s表示替换,三根斜线中间是替换的样式,特殊字符需要使用反斜线”\”进行转义。
2. 单引号” ‘ ’”是没有办法用反斜线”\”转义的,这时候只要把命令中的单引号改为双引号就行了,格式如下:
# 要处理的字符包含单引号
sed "s/原字符串包含'/替换字符串包含'/"
3. 命令中的三根斜线分隔符可以换成别的符号,有时候替换目录字符串的时候有较多斜线,这个时候换成其它的分割符是较为方便,只需要紧跟s定义即可。
# 将分隔符换成问号”?”:
sed 's?原字符串?替换字符串?'
4. 可以在末尾加g替换每一个匹配的关键字,否则只替换每行的第一个,例如:
# 替换所有匹配关键字
sed 's/原字符串/替换字符串/g'
5. 一些特殊字符的使用
”^”表示行首
”$”符号如果在引号中表示行尾,但是在引号外却表示末行(最后一行) # 注意这里的 " & " 符号,如果没有 “&”,就会直接将匹配到的字符串替换掉
sed 's/^/添加的头部&/g' #在所有行首添加
sed 's/$/&添加的尾部/g' #在所有行末添加
sed '2s/原字符串/替换字符串/g' #替换第2行
sed '$s/原字符串/替换字符串/g' #替换最后一行
sed '2,5s/原字符串/替换字符串/g' #替换2到5行
sed '2,$s/原字符串/替换字符串/g' #替换2到最后一行
6.批量替换字符串
在linux 没有安装vi/vim 可以使用下面命令编辑文件:
sed -i "s/var params myvalidate.UserFigma/defer c.JsonReturn() \n var params myvalidate.UserFigma/" user_controller.go
sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径`
sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir
7. sed处理过的输出是直接输出到屏幕上的,使用参数”i”直接在文件中替换。
# 替换文件中的所有匹配项
sed -i 's/原字符串/替换字符串/g' filename
8. 多个替换可以在同一条命令中执行,用分号”;”分隔,其格式为:
# 同时执行两个替换规则
sed 's/^/添加的头部&/g;s/$/&添加的尾部/g'
cut
cut
-d 指定分隔符
-f 显示第几列
cut -d ":" -f 1 passwd
awk # 通过正则表达式 , 得到需要的行 , 列信息
awk '/root/' passwd #打印所有包含有 root 字段的行
df -h |awk '{print $2}' #打印df -h的第二列内容
df -h |awk '{print $2,$5}' #打印df -h的第二列和第五列
awk 'NR==4' passwd #显示文件的第四行
df -h |awk '/\/dev\/sda2/ {print $2}' #打印df -h含有/dev/sda2的行的第二区域
\为转义符号 ---忽略符号的原有含义
date | awk ‘{print “Year:” $6 “\nMonth:” $2 }’
#显示年月信息,\n 为换行符
df -h|awk '/dev/ {print NR,$2}' # 匹配含有dev的行 显示行号并打印第二列
awk -F ":" '{print $2}' # 以:为分隔符打印第二列
awk 认为文件中每一行是一条记录 记录与记录的分隔符为空
awk [命令选项] `{}` [fliename]
-F fs 指定文件分隔符
-f file 指定读取程序的文件名
awk '{print $1}' file
awk '{print $NF}' file
awk '{print $1,$3,$5}' file
head -l /etc/passwd | awk -F: '{print $1 "-" $3"-"$5}'
awk 'NR==3{print $0}NR==5{print $0}' file
awk -F : 'NR==1{print $1}' /etc/passwd
BEGIN END
awk 'BEGIN{print "hello"}{print $0}' file
awk 'END{print "hello"}{print $0}' file
awk 'BEGIN{print 100*100/20}'
awk 'BEGIN{A=1;B=2;print A+B}'
awk 'BEGIN{print 20^3}'
awk 'NR==1{t=$2}NR==2{f=$2;pfrint (t-f)*100/t}' /proc/meminfo |grep -F. '{print $1}'
+=累加
vim aa
1
2
3
4
awk '{sum += $1}END{print sum}' aa
例
cat /proc/25399/smaps |grep Rss|awk '{sum += $2}END{print sum}'
条件运算
比较运算
awk '$1>=2{print $0}' aa
awk '$1==2{print $0}' aa
awk '$1!=2{print $0}' aa
awk '$1<2{print $0}' aa
awk -F: '$1=="root"{print $0}' /etc/passwd
awk -F: '$1!="root"{print $0}' /etc/passwd
awk -F: '$1 ~ "ro"{print $0}' /etc/passwd
awk -F: '$1 ~ "^ro"{print $0}' /etc/passwd