行操作 sed
sed [选项] '操作' 参数

常见的 sed 命令选项主要包含以下几种
选项:
-e	表示用指定命令或脚本来处理输入的文本文件
-f	表示用指定的脚本文件来处理输入的文本文件
-h	或--help 显示帮助
-n	表示显示处理后的结果
-i	直接编辑文本文件
-i.bak	备份文本文件
-r,-E	使用扩展正则表达式
-s	将多个文件视为独立文件,而不是单个连续的长文件流

sed命令的常用操作
“操作”用于指定对文件操作的动作行为,也就是 sed 的命令
a	增加,在当前行下面增加一行指定内容
c	替换,将选定行替换为指定内容
d	删除,删除选定的行
i	插入,在选定行上面插入一行指定内容
p	打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容
s	替换,替换指定字符
y	字符转换

Eg:

#替换内容
#r 扩展正则\1 讲()后面所匹配的内容替换为ten指定内容
sed -ri 's/(age=).*/\1ten/' sl.sh
sed -i 's/(age=).*/&22/' sl.sh
#按行处理+g  匹配到所有行的所有相对应字符都替换掉
sed -i 's/lo/ho/g' a.sh
#按行处理 匹配到的第一个字符替换掉
sed -i 's/hook/look/' a.sh
#综合eg
ifconfig eth0| sed -n '2p'| sed 's/^.*inet//' | sed 's/net.*$//'
#连续命令
ifconfig eth0 | sed -ne '2s/^.*inet//' -ne '2s/net.*$//p'

#删除内容
sed -i '1,5d' a.sh
sed -i '3,$d' a.sh
#匹配到含关键词的行
sed -i '/pppp/d' a.sh
sed -i '/11/d' a.sh
#匹配多个模式之间的删除
sed '/4/,/7/d' a.sh
sed '/643y/,/hahahh/d' a.sh #如果匹配不到结束后面内容会全部删掉!!

#追加内容
在匹配的下一行新增一行内容
#精准匹配含有某字符的某行
sed -i '/hook/a hookxia' a.sh
sed -i '/happpy/a 22!x' a.sh
#指定第几行
sed -i '1a ooooo' a.sh #第一行后
sed '2,4a xxxx' a.sh  #2-4行后
sed -e '2a xxxx' -e '4a xxxx' a.sh    #第2行和第4行后
sed '$a xxxx' a.sh		#在行尾
sed -i '3i xxxx' a.sh   #第3行前
sed '1i xxxx' a.sh   #在第一行前(首行)
#匹配22开头的行(下一行加)
sed -i '/^22/a 22xia' a.sh
#匹配haha结尾的行(上一行加)
sed '/haha$/i hahahha' a.sh


#打印查找内容
sed -n '/pattern/p' filename
#匹配含关键字4534和含关键字ppy 之间的行并打印  
(有多行含该关键字的从上往下顺序哪行先匹配到就是哪行)  
sed -n '/4534/,/ppy/p' a.sh
sed -n '/30\/Apr\/2024:20:34:53/,/30\/Apr\/2024:20:35:23/p' access.log > /data/sed/acc.log
sed -n '/rfe$/,/^rvd/p' a.sh




列操作 awk
NR:表示该处理的行序号是多少
NF:表示该处理的行,有多少列
-F : 指定分割字段符
-v :定义或者修改一个awk内部变量
-f :从脚本文件中读取awk命令

awk '{print $1,$3}' a.sh #,号 会默认空格隔开
awk '{print $1$3}' a.sh  
awk '{print "第2列:"$2,"第3列:"$3 }' a.sh
awk '{print "每一行的内容:"$0 }' a.sh 

awk 'NR==3' a.sh   #第三行   =是修改变量 ==才是等于

awk '{print NF}' a.sh
awk '{print $NF}' a.sh 最后尾列

awk 'NR==2{print $0}' a.sh   #找到第三行并打印第三行全部信息

awk '{print NR,$0}' a.sh    #显示所有内容并打印行号

awk 'NR==2,NR==5{print NR,$0}' a.sh   #打印3-5行信息并输出行号
awk -F ":" 'NR==1||NR==28{print $1,$6}' p.sh   #打印第1行 和 第28行

awk '{print $1,$(NF-1)}' a.sh  #第一列和倒数第2列
 
awk '{print $1,$(NF-1),$(NF-2)}' a.sh	#第一列和倒数第3列

ifconfig eth0 | awk 'NR==2{print $2}'    q取出ip地址 默认分隔符空格

以下两种用法相同 -v指定修改 FS变量的默认值空格为冒号 :
awk -F ":" '{print $1}' p.sh
awk -v FS=":" '{print $1}' p.sh

awk -F ":" '{print $1$3}' p.sh
awk -F ":" '{print $1,$3}' p.sh
awk -F ":" '{print $1,$NF}' p.sh

#	,逗号 默认是空格 修改其变量OFS的值改变分隔符的值
awk -F ":" -v OFS="---" '{print $1,$NF}' p.sh    
awk -F ":" -v OFS="\t" '{print $1,$NF}' p.sh

#匹配含有ud字符的行 (所有含有该字符的行) 打印第一和尾列
awk -F ":" -v OFS="\t" '/ud/{print $1,$NF}' p.sh
#匹配t字符开头的行 (所有含有该字符的行) 打印第一和尾列
awk -F ":" -v OFS="\t" '/^t/{print $1,$NF}' p.sh


awk '/ud3/' p.sh
awk -F: '/ud3/{print $1,$6}' p.sh
awk -F: '/ud3/{print "该行有列数:"NF,"是第几行:"NR,$1,$6}' p.sh
awk -F ":" 'NR!=2{print $1}' p.sh
awk -F ":" '/\/sbin\/nologin$/{print $1,$7}' p.sh 
awk -F ":" '/^daemon/,/halt$/{print $0}' p.sh   #匹配符合规则关键字的行 先匹配到即停
awk -F ":" '/^daemon/,/98/{print $0}' p.sh

案例:同统计nginx访问ip
awk '{print $1}' /data/nginx/logs/access.log | sort -n | uniq | wc -l

awk '{print $1}' /data/nginx/logs/access.log | sort -n | uniq -c | sort -rn | head -10

awk -F ":" '/^u/&&/bash/{print $0}' a.sh  #以u开头的 普通用户的记录
awk -F ":" '/^u/&&/bash/{print $1,$6}' a.sh
awk -F ":" '$3>100{print $1,$3,$6}' a.sh
awk -F ":" '$3!=$4{print $1,$3,$4,$6}' a.sh   #用户的uid不等于其gid
awk -F ":" 'NR>=5 && NR<=10{print NR,$1,$5}' a.sh
 
awk -F: '$NF ~ /bash/{print $0}' p.sh    #尾部含bash(即普通用户)
awk -F: '$1 ~ /u/{print $0}' p.sh        #第一列含 u
awk -F: '$1 ~ /^u/{print $0}' p.sh
awk -F: '$1 !~ /^u/{print $0}' p.sh		 #不以u开头的






#