行操作 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开头的

user=$(awk -F: '/bash$/{print $1}' /etc/passwd)
for i in $user
do
        awk -F: -v x=$i '$1==x{print $1,$2}' /etc/shadow
		#需要-v指定内部变量x 才能将值带进去
done



grep 搜索

grep [选项] 模式 [文件名]

常用的grep命令选项
-i:忽略大小写,不区分大小写地匹配模式。
-r:递归地搜索目录及其子目录下的文件。
-l:只打印包含匹配模式的文件名,而不打印匹配的行。
-n:打印匹配行的行号。
-v:反转匹配,只打印不匹配模式的行。
-w:仅匹配整个单词,而不是部分匹配。
-c:打印匹配模式的行数统计。
grep -E进行实践扩展正则

grep案例用法:

cat /etc/passwd > a.txt q.txt z.txt  
cat /etc/init.d/functions > e.sh

grep -E '^(root|ud)\>' /etc/passwd
grep -E '^(root|ud)' /etc/passwd
grep -v -E '^(root|ud)\>' /etc/passwd
grep -c '^ud' /etc/passwd
grep -m 1 '^ud' /etc/passwd
grep -m 2 '^ud' /etc/passwd

grep '^ud' q.txt a.txt z.txt
grep -l '^ud' q.txt a.txt z.txt

grep -v -n  '/bin/bash$' q.txt

grep -E '[0-9]{2,3}' a.txt 
grep -E '[0-9]{2,3}\>' a.txt
grep -E '\<[0-9]{2,3}\>' a.txt

grep '^$' w.txt -n
grep '^[[:space:]]' w.txt
grep -E '^[[:space:]]+[^[:space:]]' w.txt
grep -E '^[[:space:]][[:space:]]' w.txt

grep -i '^r' w.txt
grep -E '^(r|R)' w.txt
grep -E '^[rR]' w.txt

grep -E '^(root|nobody|ud)>' q.txt
grep -E '^(root|nobody|ud)\>' q.txt

grep -E '\w+\(\)' e.sh
grep -E '[a-zA-Z]+\(\)' e.sh
grep -E '.*[a-zA-Z]+\(\)' e.sh

grep -E '^([^:]+\>)' a.txt

grep -E '^([^:]+\>).*\1$' a.txt


sed 案例用法:
sed -n 's/ud/qq/p' q.txt  #替换每行匹配的第一个
sed -n 's/ud/qq/gp' q.txt #替换所有行的所有匹配项

sed -n '2,5p' a.txt
sed -n '2,5s/sbin/habin/p' a.txt
sed -n '2,5s/sbin/habin/gp' a.txt

sed -n -e '1,10s/^bin/C/p' -e 's/^m/M/p' a.txt

sed -i '/^bin/,/^ftp/d' a.txt

sed -i 's/^[[:space:]]/#/g' w.txt

sed -i -e '/^#/d' -e '/^$/d' w.txt
sed -i '/^#/d;/^$/d' w.txt

sed -r -i  '1,3s/(^.)/@\1/' a.txt

ifconfig eth0 | sed -n '2p' | sed 's/^.*inet//' | sed 's/netmask.*//'
ifconfig eth0 | sed -n '2s/^.*inet//;s/netmask.*//p'
ifconfig eth0 | sed -e '2s/^.*inet//' -e 's/netmask.*//p' -n

cat /etc/centos-release | sed -n -r 's/^.*release[[:space:]]([^.]).**/\1/p'
cat /etc/centos-release | sed -n -r 's/^.*release[[:space:]]([^.]+).**/\1/p'
cat /etc/centos-release | sed -n -r 's/^.*release[[:space:]]//;s/([^.]+.*)[[:space:]]\(Core\)/\1/p'



awk 案例用法:

cat a.txt | awk -F ":" '{print $1,$(NF-1)}'
cat a.txt | awk -F ":" '$3>1000{print $1,$(NF-1)}'

awk 'NR<6{print "#"$0}' w.txt

awk -F "[ :]" '{print $4}' t.txt              #以空格和:作为分割
awk -F "[ :]" '!/^$/{print $4}' t.txt	      #排除空行

awk -F "[ :]" '!/^$/||/ha/{print $4}' t.txt       ||
awk -F "[ :]" '!/^$/&&/ha/{print $4}' t.txt		  &&
awk -F "[ :]" '/tom/||/jerry/{print $4}' t.txt

awk -F "[ :]" '$2~/qwert/||$1~/jerry/{print $4}' t.txt     # 对某些列正则规则匹配
awk -F "[ :]" '$2~/qwert/||$1~/^je/{print $4}' t.txt
awk -F "[ :]" '$6~/www$/&&$2~/trewq/{print $4}' t.txt

awk -F "[ :]" '/jerry/{print "#"$1,"$"$3,"$"$4}' t.txt




#