SED_AWK_正则
Posted mr-haibo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SED_AWK_正则相关的知识,希望对你有一定的参考价值。
AWK
awk [选项] ‘条件{指令}’ 文件 //后面不一定要跟文件,可以接管道
命令 | awk [选项]
条件:
1,/正则/(模糊匹配)
#awk ‘/root/’ /etc/passwd //包含root的行
#awk -F: ‘$5~/root/’ /etc/passwd //$5~代表在第5列里包含root
#awk -F: ‘$5!~/root/’ /etc/passwd //代表第5列里不包含root
2,字符和数字比较(==,!=,>=,<=,<,>)
#awk -F: ‘$1==”root”{print $3}’ /etc/passwd
#awk -F: ‘$3<1000{print $1}’ /etc/passwd //找出所有的系统用户
3,逻辑符号&&,||
#awk -F: ‘$3>10&&$3<20’ /etc/passwd
#awk -F: ‘$3>=1000||$3<=10’ /etc/passwd
#seq 300 | awk ‘$1%3==0||$1~/3/‘ //求300内,可以被3整除或包含3的数
指令{print行} //没条件则默认打印全部
print $0 一整行
print $1 第1列
print $2 第2列
print NF 当前行有几列
print NR 当前行的行号
print $NF 打印每一行的最后一列
#awk -F: ‘NR==10,NR=20{print}’ //可以通过这样来打印10-20行的内容
#awk -F: ‘NR>9&&NR<21{print}’ //这样打印10-20行的内容也可以
awk默认的分隔符是空格或Tab
#awk -F: ‘{print $1}’ /etc/passwd //以:为分隔符
#awk -F‘:|[ ]‘ ‘{print $1}‘ //这里以:和空格为分隔符,要注意awk多分隔符的问题
#awk ‘BEGIN{}条件{}END{}’ 文件
BEGIN{}里面的指令,在读取文件内容之前就执行,仅执行1次
条件{}里面的指令,读文件过程中执行,执行N次(文件行数)
END{}里面的指令,在读取文件后执行,仅执行1次
#awk ‘BEGIN{print 1.3*2.3}’ //后面不用加文件,可以作为计算器来用
#awk ‘BEGIN{x=3;print 22/x}’ //以;分隔命令
#awk ‘/bash$/{x++} END{print x}’ /etc/passwd //统计能登录的用户
#awk -F: ‘BEGIN{print "用户名 UID 家目录"}{print $1" "$3" "$6}‘ /etc/passwd | column -t //以” ”为分隔符,打印后按制表符,管道column -t能让输出更美观。
# awk -F: ‘$1==ENVIRON["USER"]{print}‘ /etc/passwd //输出当前用户的用户信 息,ENVIRON["USER"] 引用全局变量USER
如何在awk中引用变量:
方法一:”’$A’”——双引号+单引号+$变量+单引号+双引号
方法二:”’”$A”’”——两边都用”’”包围,双引号+单引号+双引号
方法三:如果是全局变量,ENVIRON["USER"] 引用变量USER,不是全局变量的话先用export命令变成全局变量
awk的高级应用[支持if,for,while] if是命令,必须写在基本格式的{}里
if() {} else{}
if() {} else if() {} else if() {} else {}
#awk -F: ‘{if($3>=1000) {x++} else {y++}}END{print "普通:"x," 系统:"y}‘ /etc/passwd
blog.51cto.com 丁丁历险
while(){}
#awk -F: ‘{i=1;while(i<=NF){if($i=="root"){x++}i++}}END{print x}‘ /etc/passwd //以后写的时候最好用竖结构写好再套进去
sed 文本编辑器(非交互)
语法:
sed [选项] ‘条件指令’ 文件
选项:
-r 支持扩展正则
-n 一般和p打印一起用
-i 直接修改文件内容
-{} 可组合多个命令,以分号隔开
条件:行号,/正则/,无条件
指令:
s:替换 sed -n ‘s/old/new/’ 将每行的第1个old替换为new
sed -n ‘s/old/new/3’ 将每行的第3个old替换为new
sed ‘1s/$/hello/;3s/$/hello’ 在第1,3行的后面添加hello字符
sed -n “/<name>/s/rhel6/rhel7/” 把包含<name>的行的rhel6替换为rhel7
sed -n ‘s/old/new/g’ 将所有的old都替换为new
sed -n ‘p;n’ 输出奇数行
sed -n ‘n;p’ 输出偶数行
sed -n ‘$=’ 输出文件的行数
sed -n ‘4,+10p’ 输出第4行及其后的10行内容
替换操作的分隔”/”,可用其它字符,如#,&等等,便于修改文件路径
d:删除
sed ‘/xml/d’ 删除所有包含xml的行
sed ‘/xml/!d’ 删除不包含xml的行,!符号表示取反
p:打印
i 行前插入文本 sed -i ‘3iXXX’ 文件 //写在第3行
a 行后插入文本 sed -i ‘3aYYY’ 文件 //写在第4行
sed ‘$a192.168.4.5 svr5.tarena.com svr5’ /etc/hosts
//在文档的最后一行添加一行,内容为”192.168.4.5 svr5.tarena.com svr5”
c 替换当前行 sed ‘3c XX’ 文件 //整行替换
sed ‘/^HOSTNAME/cHOSTNAME=mysvr.tarena.com’ /etc/sysconfig/network //把以HOSTNAME开头的行整行替换为HOSTNAME=mysvr.tarena.com
不常用r,w,H,G sed ‘2r /etc/hosts’ 文件名——在第2行添加/etc/hosts的内容
sed ‘w /root/new.txt’ 文件名——把文件全部内容写到/ root/new.txt里面
H追加复制,h覆盖复制;G追加粘贴,g覆盖粘贴
sed ‘2H;5G’ 文件名
sed逐行处理器,处理大文件效率高
sed也可以接管道
指令:增,删,改,查。实现对文本的输出,删除,替换,复制,剪切,导入,导出
条件:
行号
/正则/ /abc/d 删除包含abc的行
打印指令
#sed -n ‘/local*/p‘ rclocal.txt //显示包含”loca”的行,l可有可无
#sed -n ‘/local$/p‘ rclocal.txt //注意这两句的区别,上面是local后面可 以有东西,下面是local后面不可以有东西
#sed -n ‘5,$p‘ rclocal.txt //输出第五行到最后一行
删除指令
#sed ‘2d’ /etc/passwd
#sed ‘/正则表达式/d’ /etc/passwd
()复制并保留——基本正则
()复制并保留——扩展正则
abcdoabcd-abcdpabcd
#egrep “(abcd)o1-1p1” //(abcd)代表复制,1代表引用
替换指令-变相删除操作
#sed ‘1s/old/new/’ 文件
#sed ‘s/old/new/’ 文件
#sed ‘s/.//2;s/.$//‘ nssw.txt //删除文中每行的第二个和最后一个字符
#sed -r ‘s/^(.)(.)(.*)/213/‘ nssw.txt //将文件中每行的第一个、第二个字符互换
每行文本拆分为“第1个字符”、“第2个字符”、“剩下的所有字符”三个部分,然后通过替换操作重排顺序为“2-1-3”,用-r才能(.)定义,然后1来引用
#sed -r ‘s/[0-9]//g;s/^( )+//‘ nssw2.txt //删除所有数字、行首空格,+代表可能多个空格
-r表示应用扩展正则
#sed ‘s/[A-Z]/(&)/g‘ nssw.txt //为文件中每个大写字母添加括号
使用“&”可调用s替换操作中的整个查找串
# sed -r -i ‘/^IPADDR/s/192.168.4.(.*)/172.16.16.1/‘
/etc/sysconfig/network-scripts/ifcfg-eth0
要求只修改网段地址时,可以利用扩展正则表达式的 1、2、……等调用,分别对应此前第1个、第2个、…… 以 ()包围的表达式所匹配的内容。
#sed -n ‘$=’ a.txt //输出文件的行数,$指代最后一行的行数
#sed ‘$d’ a.txt //删除文件的最后一行
#sed ‘/^$/d’ a.txt //删除所有空行
#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开头的替换为an,去除行首的#,用于ftp配 置文件能允许匿名上传和建文件夹
UREC=$(sed -n ‘1p’ /etc/passwd) //取第一行的记录
正则表达式
1,基本正则(模糊查找)
^ 开始
$ 结尾 ^$表示空行
[] 集合(取任意单个),里面的元素没有前后顺序[a-z] [A-Z] [0-9] [a-fmox-z0-5]=[abcdefmoxyz012345]
比如要查找tast和test,t[ae]st
[^] 对集合取反[^a-z],a-z都不需要
[^A-Z] 匹配包括非大写字母的行
^[^a-z] 匹配不以小写字母开头的行
. 任意单个字符
* 前一个字符出现了n次(包括0次),不能单独用,a*表示a出现任意次。the*,只匹配前一个 字符
.* 多个任意字符
{n,m} 前一个字符出现了n到m次,a{1,3},a出现1到3次
{n,} 前一个字符出现了n到任意次
{n} 前一个字符出现了n次,刚好n次
()
grep “正则” 文件
-i 不区分大小写
-v 反查verse
-n 显示行号number
-c 统计找到了几行count
-q 安静地查找,找不找得到都不显示,一般脚本才需要用这个,配合echo $?使用。
vim进去后也支持正则
grep -v “^$” /etc/postfix/main.cf /etc/postfix/main.cf //检索空白行
2,扩展正则(简化基本正则,扩张新内容)
{n,m} 前面的内容出现了n到m次
() 代表整体 c(ab)?的结果是c或者cab
? 可有可无0-1次
+ 前面的内容出现了至少1次 扩展?+等于基本的*
(|) 或者 //grep (test|taste)
基本正则:兼容性强但麻烦,几乎所有软件都能使用基本正则
扩展正则:简单但兼容性差,不是每个软件都能使用扩展正则
#grep “the” a.txt //检索the这个单词,是不能有字符的意思
注意和the,the的区别。
以上是关于SED_AWK_正则的主要内容,如果未能解决你的问题,请参考以下文章