sed & awk 用法

发布时间 2023-03-23 17:34:34作者: zyl88

sed stream EDitor 流式文本编辑器
非交互,基于模式匹配过滤及修改文本
逐行处理,并将结果输出到屏幕
可实现对文本的输出、删除、替换、复制、剪切、导入、导出等各种操作

用法1:前置命令 | sed [选项] '编辑指令'
用法2:sed [选项] '编辑指令' 文件
###############################

参数
-e<script> 或 --expression=<script> 以选项中指定的script来处理输入的文本文件
-f<script文件> 或 --file=<script文件> 以选项中指定的script文件来处理输入的文本文件
-h 或 --help 显示帮助
-n 或 --quiet或--silent 仅显示处理后的结果 //常用
-V 或 --version 显示版本信息
-i 直接修改文件内容 //先测试,再使用
-r 启用扩展的正则表达式,应作为首个选项
{} 可组合多个命令,以;分隔
#######################

动作
a :新增 a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
c :取代 c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
d :删除行 所以 d 后面通常不接任何东西
i :插入 i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
p :增加行 亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
s :取代 可以直接取代字符串
s/lll/zzz/ 将每行的第1个lll替换为zzz
s/lll/zzz/3 将每行的第3个lll替换为zzz
s/lll/zzz/g 将所有的lll都替换为zzz
替换操作的分隔" / " 可改用其他字符 ! @ # $ % ^ & * 便于修改文件路径
, 3到5
; 3和8
###########

输出文本
sed -n 'p'a.txt 输出所有行,等同于cat a.txt
sed -n '4p'a.txt 输出第4行
sed -n '4,7p'a.txt 输出第4~7行
sed -n '4,+10p'a.txt 输出第4行以及其后的10行内容
sed -n '/^bin/p'a.txt 输出以bin开头的行
sed -n 'p;n'a.txt 输出奇数行,n表示读入下一行文本(隔行)
sed -n 'n;p'a.txt 输出偶数行,n表示读入下一行文本(隔行)
sed -n '$='a.txt 输出文件的行数
sed -n '5,$p' rclocal.txt 第5行输出到最后一行
sed -n '$=' rclocal.txt 输出文本的行数
sed -n '/init/!d' rclocal.txt 删除不包括“init”的行

删除文本
sed '3,5d'a.txt 删除第3~5行
sed '/xml/d'a.txt 删除所有包含xml的行
sed '/xml/!d'a.txt 删除不包含xml的行,!符号表示取反
sed '/^install/d'a.txt 删除以install开头的行
sed '$d'a.txt 删除文件的最后一行
sed '/^$/d' a.txt 删除所有空行
sed '$d' rclocal.txt 删除文件的最后一行

替换文本
sed 's/xml/XML/'a.txt 将每行第一个xml替换为XML
sed 's/xml/XML/3'a.txt 将每行中的第3隔xml替换为XML
sed 's/xml/XML/g'a.txt 将所有的xml都替换为XML
sed 's/xml//g'a.txt 将所有的xml都删除(替换为空串)
sed 's/doc/&s/g'a.txt 将所有的doc都替换为docs,&代表查找串
sed '4,7s/^/#/'a.txt 将第4~7行注释掉(行首加#号)
sed 's/^#an/an/'a.txt 解除以#an开头的行的注释(去除行首的#号)

sed '3s/script/SCRIPT/2' rclocal.txt 将第3行内的第2个“script”替换为“SCRIPT”
sed 's/.//2;s/.$//' nssw.txt 第一次替换掉第2个字符,第二次替换掉最后一个字符

sed -r 's/[0-9]//g;s/^( )+//' nssw2.txt 删除文件中所有的数字、行首的空格
sed 's/[A-Z]/(&)/g' nssw.txt 为文件中每个大写字母添加括号
sed '/^HOSTNAME/cHOSTNAME=mysvr.tarena.com' /etc/sysconfig/network c整行替换


/etc/passwd把能登陆的用户提取出来(第一列):sed -n '/bash$/s/:.*//p' /etc/passwd


  

awk  [选项]  ' BEGIN{编辑指令 } {编辑指令} END{编辑指令}'  文件

输出奇数行(行号NR除以2余数为1)的用户记录:  awk -F: 'NR%2==1{print}' passwd.txt
输出前3行文本:                           awk -F: 'NR<=3{print}' passwd.txt

统计/etc/passwd文件中UID大于500的用户个数:   awk -F: 'BEGIN{i=0}{if($3>500){i++}}END{print i}' /etc/passwd
统计/etc/passwd文件中登录Shell不是“/bin/bash”的用户个数:awk -F: 'BEGIN{i=0}{if($7!~/bash$/){i++}}END{print i}'   /etc/passwd
分别统计/etc/passwd文件中登录Shell是“/bin/bash”、“/sbin/nologin”、其他的用户个数: awk -F: 'BEGIN{i=0;j=0;k=0}{if($7~/bash$/){i++} else if($7~/nologin$/){j++}else{k++}}END{print i,j,k}' /etc/passwd
统计/etc/passwd文件内“root”出现的次数:   awk -F [:/] 'BEGIN{j=0}{i=1}{while(i<=NF){if($i~/root/){j++};i++}}END{print j}'  /etc/passwd
统计Web访问量排名: awk  '{ip[$1]++} END{for(i in ip) {print i,ip[i]}}' /var/log/httpd/access_log | sort -nr -k 2  
  
查询 file1 里面空行的所在行号: awk ‘{if($0~/^$/)print NR}’ file    or   grep -n ^$ file |awk ‘BEGIN{FS=”:”}{print $1}’  
awk 不显示 4 的倍数行:        awk 'NR%4' NBA.txt  
查看当前系统每个IP的连接数 :   netstat --n |awk '/^tcp/ {print $5}' | awk -F: '{print  $1}' |sort  |uniq -c |sort -rn