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_正则的主要内容,如果未能解决你的问题,请参考以下文章

markdown预览前端实现是用正则匹配么

js_高级_正则表达式

JAVA正则表达式判断 只能包含汉字、英文、“_”和数字 ,正则该怎么写呢?

第五课-第一讲05_01_egrep及扩展正则表达式

正则表达式过滤'_'下划线。

正则表达式如何提取中间的数字?