Linux5.6 正则练习

1.  把test.txt 中出现第一组数字移动到行末尾

[root@chyuanliuNJ awk]# sed -nr '24,28s#([^0-9][^0-9]*)([0-9][0-9]*)([^0-9].*$)#132#'p text.txt
operator:x::0:operator:/root:/sbin/nologin11
games:x::100:games:/usr/games:/sbin/nologin12
games:x::100:games:/usr/games:/sbin/nologin12
ftp:x::50:FTP User:/var/ftp:/sbin/nologin14
ftp:x::50:FTP User:/var/ftp:/sbin/nologin14

 2.  把test.txt中出现的第一个数字和最后一个单词替换位置

[root@chyuanliuNJ awk]# sed -nr '7,11s#([^0-9][^0-9]*)([0-9][0-9]*)([^0-9].*)([^a-zA-Z])([a-zA-Z][a-zA-Z]*$)#15342#'p text.txt
bin:x:nologin:1:bin:/bin:/sbin/1
bin:x:nologin:1:bin:/bin:/sbin/1
daemon:x:nologin:2:daemon:/sbin:/sbin/2
daemon:x:nologin:2:daemon:/sbin:/sbin/2
adm:x:nologin:4:adm:/var/adm:/sbin/3
[root@chyuanliuNJ awk]# sed -n '7,11'p text.txt
bin:x:1:1:bin:/bin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

 3.  每个单词的第一个小写字母变大写;所有小写变大写;所以大写变小写

[root@chyuanliuNJ awk]# sed -nr '26,28s/[a-z]/u&/g'p text.txt
Games:X:12:100:Games:/Usr/Games:/Sbin/Nologin
Ftp:X:14:50:FTP User:/Var/Ftp:/Sbin/Nologin
Ftp:X:14:50:FTP User:/Var/Ftp:/Sbin/Nologin
[root@chyuanliuNJ awk]# sed -n '26,28s/[a-z]/u&/g'p text.txt
GAMES:X:12:100:GAMES:/USR/GAMES:/SBIN/NOLOGIN
FTP:X:14:50:FTP USER:/VAR/FTP:/SBIN/NOLOGIN
FTP:X:14:50:FTP USER:/VAR/FTP:/SBIN/NOLOGIN
[root@chyuanliuNJ awk]# sed -n '3,4s/[A-Z]/l&/g'p text.txt
root:x:10
root:x:10

 4.  awk 中使用外部shell变量

5.  awk 合并一个文件

#我有这样的需求,需要把两个文件中,第一列相同的行合并到同一行中。举个例子,有两个文件,内容如下
cat 1.txt
1 aa
2 bb
3 ee
4 ss

cat 2.txt
1 ab
2 cd
3 ad
4 bd
5 de

合并后的结果为:

1 ab aa
2 cd bb
3 ad ee
4 bd ss
5 de
[root@chyuanliuNJ awk]# awk '{if(NR==FNR){a[$1]=$2}};{if(NR>FNR){print $0,a[$1]}}'  1.txt  2.txt
1 ab aa
2 cd bb
3 ad ee
4 bd ss
5 de

 6.  awk中gsub函数的使用

#text.txt文件中把所有www替换为abc
[root@chyuanliuNJ awk]# awk 'gsub(/www/,"abc")' text.txt
abc:x:1002:1002::/home/abc:/bin/bash
abc:x:1002:1002::/home/abc:/bin/bash

#替换$1中的www为abc
[root@chyuanliuNJ awk]# awk -F ':' '{OFS=":"} gsub(/www/,"abc",$1) {print $0}' text.txt
abc:x:1002:1002::/home/www:/bin/bash
abc:x:1002:1002::/home/www:/bin/bash

 7.  awk用print打印单引号

awk '{print "This is a '"'"'"$1} filename 
#在awk中使用脱义字符是起不到作用的,如果想打印特殊字符,只能使用'""' 这样的组合才可以。这里自左至右为单引号 双引号 双引号 单引号其中两个单引号为一对,两个双引号为一对。想脱义$那就是'"$"' 脱义单引号那就是 '"'"' 
[root@chyuanliuNJ awk]# awk -F ':' 'NR<=5 {print "'"$"'"$1}' text.txt
$root
$root
$ROOT
$ROOT
$Chy

8.  合并两个文件

#paste  filename1  filename2

[root@chyuanliuNJ awk]# cat 1.txt
1 aa
2 bb
3 ee
4 ss
[root@chyuanliuNJ awk]# cat 2.txt
1 ab
2 cd
3 ad
4 bd
5 de
[root@chyuanliuNJ awk]# paste 1.txt 2.txt
1 aa    1 ab
2 bb    2 cd
3 ee    3 ad
4 ss    4 bd
          5 de
#如果想在两个文件连接处用一个指定的字符连接,还可以用-d来指定
[root@chyuanliuNJ awk]# paste -d '++' 1.txt 2.txt
1 aa+1 ab
2 bb+2 cd
3 ee+3 ad
4 ss+4 bd
+5 de

9.  awk其他用法http://www.cnblogs.com/emanlee/p/3327576.html

http://ask.apelearn.com/question/213 sed删除某关键字的下一行到最后一行

http://ask.apelearn.com/question/199  awk 中使用外部shell变量

http://ask.apelearn.com/question/266  把一个文件多行连成一行

http://ask.apelearn.com/question/224  截取多个域为一行

http://ask.apelearn.com/question/5494  用awk生成以下结构文件

原文地址:https://www.cnblogs.com/chyuanliu/p/7891200.html