侧边栏壁纸
博主头像
落叶人生博主等级

走进秋风,寻找秋天的落叶

  • 累计撰写 130562 篇文章
  • 累计创建 28 个标签
  • 累计收到 9 条评论
标签搜索

目 录CONTENT

文章目录

文本处理工具 grep awk sed完全解读

2023-12-11 星期一 / 0 评论 / 0 点赞 / 39 阅读 / 29847 字

文本处理工具 grep awk sed完全解读正则表达式单字符1特定字符 : 某个具体的字符 'a'2范围内字符 : [a-zA-Z]3任意字符 : . // grep . file // 如果点

文本处理工具 grep awk sed完全解读

正则表达式单字符

  • 1特定字符 : 某个具体的字符 'a'
  • 2范围内字符 : [a-zA-Z]
  • 3任意字符 : . // grep . file // 如果点放到中括号中[.] 或者用反斜杠'/.' 则它不代表任意一个字符,而代表它本身 例如 grep '/.' file
  • 4反向字符 [^a-z] [^0]

正则表达式其他符号

  • 边界字符 : 头字符 ^ : ^root 注意与 [^] 的区别
  • 边界字符 : 尾字符 $ : false$ 空行表示为 ^$
  • 元字符 :
    /w 代表着普通字符或者特殊字符 匹配任何字类字符,包括下划线 [A-Za-z0-9_]
    /W 代表任何非字类字符 [^A-Za-z0-9_]
    /b 单词的分割 grep '/bx/b' passwd 为 x为单独单词的数据

正则表达式字符组合

  • 字符串 : 'root' '1000' 'm..c' m开头c结束长度为4的字符串 '[A-Z][a-z]' '/b[0-9][0-9]/b' 两位数
  1. 重复
  2. 逻辑

重复

  1. * : 0次或多次 匹配前面的字符或表达式 grep 'se*' passed
  2. + : 1次或多次 匹配前面的字符或表达式 grep 'se/+' passed + 号 出现在字符串中时代表它本身,如果作为重复表达式使用时必须加上/
  3. ? : 0次或一次 匹配前面的字符或表达式 grep 'se/?' ? 作为重复表达式使用必须加上/ 同上加号
  4. {n,m} :重复指定次数 {0,} 注意 大括号需要进行转义

上面是对单个字符的重复,如果对字符串的重复可以使用() 其中,括号使用在字符串中时加上/
(se)* 如 : grep '/(se/)*' passwd
(se)+ 如 : grep '/(se/)/+' passwd
(se)? 如 : grep '/(se/)/?' passwd
(se){2,3} 如 : grep '/(se/)/{2,3/}' passwd

任意字符表达式 : .

任意的字符串 '.*'
grep '^r.*' passwd
'm.*c' 'm..c' '/bm.*c/b' '/bm[a-z]*c/b'

逻辑的表示

| : grep 'bin//(false/|true/)' passwd () 和 | 在正则表达式中不能单独出现,必须加上/ 反斜杠

正则表达式案例


匹配4-10位qq号

grep '^[0-9]/{4.10/}$' qq.txt

匹配15位或18位身份证号 (支持带X的)

grep '^[1-9]/([0-9]/{13/}/|[0-9]/{16/}/)[0-9xX]$' qq.txt

匹配密码 (由数字 26个字母和下划线组成)

grep '^/w/+' qq.txt

正则表达式中符号必须转义的有

| () {} + ?

正则练习

  • grep OR操作:
    1. grep 'pattern1|pattern2' filename
    2. grep -E 'pattern1|pattern2' filename
    3. grep -e 'pattern1' -e 'pattern2' filename
    4. egrep 'pattern1|pattern2' filename
  • grep AND 操作:
    1. grep -E 'pattern1.*pattern2' filename
    2. grep -E 'pattern1' | grep -E 'pattern2'
  • grep NOT 操作
    1. grep -v 'pattern1' filename
[root@vm1 opt]# cat employee.txt 100  Thomas  Manager    Sales       $5,000  200  Jason   Developer  Technology  $5,500  300  Raj     Sysadmin   Technology  $7,000  400  Nisha   Manager    Marketing   $9,500  500  Randy   Manager    Sales       $6,000

OR

[root@vm1 opt]# grep 'Tech/|Manager' employee.txt 100  Thomas  Manager    Sales       $5,000  200  Jason   Developer  Technology  $5,500  300  Raj     Sysadmin   Technology  $7,000  400  Nisha   Manager    Marketing   $9,500  500  Randy   Manager    Sales       $6,000  [root@vm1 opt]# grep -E 'Tech|Manager' employee.txt 100  Thomas  Manager    Sales       $5,000  200  Jason   Developer  Technology  $5,500  300  Raj     Sysadmin   Technology  $7,000  400  Nisha   Manager    Marketing   $9,500  500  Randy   Manager    Sales       $6,000  [root@vm1 opt]# egrep 'Tech|Manager' employee.txt 100  Thomas  Manager    Sales       $5,000  200  Jason   Developer  Technology  $5,500  300  Raj     Sysadmin   Technology  $7,000  400  Nisha   Manager    Marketing   $9,500  500  Randy   Manager    Sales       $6,000  [root@vm1 opt]# grep -e 'Tech' -e 'Manager' employee.txt 100  Thomas  Manager    Sales       $5,000  200  Jason   Developer  Technology  $5,500  300  Raj     Sysadmin   Technology  $7,000  400  Nisha   Manager    Marketing   $9,500  500  Randy   Manager    Sales       $6,000  [root@vm1 opt]# 

AND

[root@vm1 opt]# grep -E 'Manager.*Sales' employee.txt 100  Thomas  Manager    Sales       $5,000  500  Randy   Manager    Sales       $6,000  [root@vm1 opt]# grep -E 'Manager.*Sales|Sales.*Manager' employee.txt 100  Thomas  Manager    Sales       $5,000  500  Randy   Manager    Sales       $6,000  [root@vm1 opt]# grep 'Manager' employee.txt | grep 'Sales'100  Thomas  Manager    Sales       $5,000  500  Randy   Manager    Sales       $6,000 

NOT
grep -v

sed命令 —— 流处理编辑器

sed是行处理工具: 一次处理一行并且不改变文本内容的(除非重定向)
sed的处理过程: 正则选定文本 -> sed进行处理

sed的格式

  • 命令行格式:sed [options] 'command' file(s)
  • 脚本格式:sed -f scriptfile file(s)命令行格式:
    options(参数) : -e , -n
    command(动作) : 行定位(正则) + sed命令(操作)
    -p (打印相关行 记得跟-n配合,否则会多次打印 ) sed -n 'p' passwd

sed —— 行定位

定位一行: x ; /pattern/

打印第十行: sed -n '10p' passwd (可以使用nl passwd | sed -n '10p' 验证 )打印abrt行: sed -n '/abrt/p' passwd

定位几行:x,y ; /pattern/,y ; /pattern1/,/pattern2/ ; x,y!

打印10到20行 : nl passwd | sed -n '10,20p'
打印news所在行和mail所在行之间的行 : nl passwd | sed -n '/news/,/mail/p'
不打印news所在行和mooc所在行之间的行 : nl passwd | sed -n '/uucp/,/rpc/!p'

间隔行定位:first~step

[[email protected] ~]$ nl passwd | sed -n '1,2p'  -- 静默输出     1  root:x:0:0:root:/root:/bin/bash     2  bin:x:1:1:bin:/bin:/sbin/nologin[[email protected] ~]$ nl passwd | sed '1,2p'     -- 全量+操作行输出(p)          1  root:x:0:0:root:/root:/bin/bash     1  root:x:0:0:root:/root:/bin/bash     2  bin:x:1:1:bin:/bin:/sbin/nologin     2  bin:x:1:1:bin:/bin:/sbin/nologin     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin     4  adm:x:3:4:adm:/var/adm:/sbin/nologin     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin     6  sync:x:5:0:sync:/sbin:/bin/sync     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown     8  halt:x:7:0:halt:/sbin:/sbin/halt     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin     .......[[email protected] ~]$ nl passwd | sed -n '1~3p'  -- 间隔行定位     1  root:x:0:0:root:/root:/bin/bash     4  adm:x:3:4:adm:/var/adm:/sbin/nologin     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown    10  operator:x:11:0:operator:/root:/sbin/nologin    13  nobody:x:99:99:Nobody:/:/sbin/nologin    16  polkitd:x:999:998:User for polkitd:/:/sbin/nologin    19  postfix:x:89:89::/var/spool/postfix:/sbin/nologin    22  gluster:x:997:995:GlusterFS daemons:/var/run/gluster:/sbin/nologin    25  tjdep:x:30101:1001:tujia deploy user:/home/tjdep:/bin/bash    28  centos:x:50003:50003:Cloud User:/home/centos:/bin/bash

sed 参数

  • -e或--expression 以选项中指定的script来处理输入的文本文件。
  • -n或--quiet或--silent 仅显示script处理后的结果。sed 操作命令
  • a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
  • c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!(全量替换,不是每行替换)
  • d :删除,因为是删除啊,所以 d 后面通常不接任何;
  • i :插入, 直接修改读取的文件内容,而不是输出到终端;
  • p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
[[email protected] ~]$ nl passwd | sed -e '1,2a / zhangsan'     1  root:x:0:0:root:/root:/bin/bash zhangsan     2  bin:x:1:1:bin:/bin:/sbin/nologin zhangsan     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin     4  adm:x:3:4:adm:/var/adm:/sbin/nologin     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin     6  sync:x:5:0:sync:/sbin:/bin/sync     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown     8  halt:x:7:0:halt:/sbin:/sbin/halt     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin    10  operator:x:11:0:operator:/root:/sbin/nologin    11  games:x:12:100:games:/usr/games:/sbin/nologin    12  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin    13  nobody:x:99:99:Nobody:/:/sbin/nologin    14  systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin    15  dbus:x:81:81:System message bus:/:/sbin/nologin    16  polkitd:x:999:998:User for polkitd:/:/sbin/nologin-- '/' 为操作命令和额外参数的间隔符 例如行前加空格对其的情况[[email protected] ~]$ nl passwd | sed -e '1,2a /     zhangsan'       1  root:x:0:0:root:/root:/bin/bash     zhangsan     2  bin:x:1:1:bin:/bin:/sbin/nologin     zhangsan     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin     4  adm:x:3:4:adm:/var/adm:/sbin/nologin     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin     6  sync:x:5:0:sync:/sbin:/bin/sync     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown     8  halt:x:7:0:halt:/sbin:/sbin/halt     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin    10  operator:x:11:0:operator:/root:/sbin/nologin    11  games:x:12:100:games:/usr/games:/sbin/nologin    12  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin    13  nobody:x:99:99:Nobody:/:/sbin/nologin    14  systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin    15  dbus:x:81:81:System message bus:/:/sbin/nologin    16  polkitd:x:999:998:User for polkitd:/:/sbin/nologin[[email protected] ~]$ nl passwd | sed -e '1,3d'     4  adm:x:3:4:adm:/var/adm:/sbin/nologin     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin     6  sync:x:5:0:sync:/sbin:/bin/sync     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown     8  halt:x:7:0:halt:/sbin:/sbin/halt     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin    10  operator:x:11:0:operator:/root:/sbin/nologin[[email protected] ~]$ nl passwd | sed -e '1,2a /     zhangsan'     1  root:x:0:0:root:/root:/bin/bash     zhangsan     2  bin:x:1:1:bin:/bin:/sbin/nologin     zhangsan     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin     4  adm:x:3:4:adm:/var/adm:/sbin/nologin     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin     6  sync:x:5:0:sync:/sbin:/bin/sync     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown     8  halt:x:7:0:halt:/sbin:/sbin/halt     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin[[email protected]$ nl passwd | sed  -e '2,5c /     zhangsan'   -- 整段替换     1  root:x:0:0:root:/root:/bin/bash     zhangsan     6  sync:x:5:0:sync:/sbin:/bin/sync     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown     8  halt:x:7:0:halt:/sbin:/sbin/halt     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin    10  operator:x:11:0:operator:/root:/sbin/nologin[[email protected] ~]$ nl passwd | sed -e '/root/d'    -- 正则匹配删除     2  bin:x:1:1:bin:/bin:/sbin/nologin     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin     4  adm:x:3:4:adm:/var/adm:/sbin/nologin     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin     6  sync:x:5:0:sync:/sbin:/bin/sync     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown     8  halt:x:7:0:halt:/sbin:/sbin/halt     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin    11  games:x:12:100:games:/usr/games:/sbin/nologin    12  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin-- 删除空行展示[[email protected]$ sed '/^$/d' passwd     root:x:0:0:root:/root:/bin/bash    bin:x:1:1:bin:/bin:/sbin/nologin    daemon:x:2:2:daemon:/sbin:/sbin/nologin    adm:x:3:4:adm:/var/adm:/sbin/nologin    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

字符串替换:s g (g全量替换)

sed 's/要被取代的字串正则/新的字串/g'

如要输出日志文件错误的IP部分:

[[email protected] /home/tomcat/logs]$ grep -iE 'ERROR' info2018-12-08 00:13:53.113 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 请求失败,code=1,message=Internal Service Error:ip[66.225.251.170] loc failed2018-12-08 00:17:42.551 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 请求失败,code=1,message=Internal Service Error:ip[172.105.240.169] loc failed2018-12-08 00:32:47.807 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 请求失败,code=1,message=Internal Service Error:ip[171.97.148.2] loc failed2018-12-08 00:35:18.650 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 请求失败,code=1,message=Internal Service Error:ip[122.155.45.101] loc failed2018-12-08 00:36:21.390 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 请求失败,code=1,message=Internal Service Error:ip[95.134.248.53] loc failed2018-12-08 00:38:27.578 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 请求失败,code=1,message=Internal Service Error:ip[27.1.208.41] loc failed2018-12-08 00:46:38.847 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 请求失败,code=1,message=Internal Service Error:ip[182.68.246.99] loc failed2018-12-08 00:47:22.042 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 请求失败,code=1,message=Internal Service Error:ip[65.74.21.178] loc failed2018-12-08 00:55:38.512 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 请求失败,code=1,message=Internal Service Error:ip[37.142.242.98] loc failed2018-12-08 01:07:41.353 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 请求失败,code=1,message=Internal Service Error:ip[94.54.26.13] loc failed2018-12-08 01:13:36.722 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 请求失败,code=1,message=Internal Service Error:ip[107.77.226.13] loc failed2018-12-08 01:24:37.047 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 请求失败,code=1,message=Internal Service Error:ip[212.58.120.105] loc failed2018-12-08 01:25:14.341 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 请求失败,code=1,message=Internal Service Error:ip[154.160.14.41] loc failed......

上面为日志文件的错误部分,接下来将对这部分文本进行处理,截取其中IP的部分输出:

[[email protected] ~]$ grep -iE 'ERROR' info | sed -n 's/.*/[//p' | sed -n 's//].*//p' 66.225.251.170172.105.240.169171.97.148.2122.155.45.10195.134.248.5327.1.208.41182.68.246.9965.74.21.17837.142.242.98......

sed提供了一种将多个sed命令合并执行的方式:{} , 上面的两个sed命令可以合并执行,之间用分号间隔:

[[email protected] ~]$ grep -iE 'ERROR' info | sed '{s/.*/[//;s//].*//}'              66.225.251.170172.105.240.169171.97.148.2122.155.45.10195.134.248.5327.1.208.41....

sed中&的使用,替换固定的字符串(对替换字符的补充) 如 sed 's/要被取代的字串正则/&新的字串/g'
其中&为被取代的字符串

[[email protected] ~]$ cat passwd root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologinftp:x:14:50:FTP User:/var/ftp:/sbin/nologinnobody:x:99:99:Nobody:/:/sbin/nologinbozhu  :x:49012:1005::/home/bozhu:/bin/bash[[email protected] ~]$ sed 's/^[a-z_-]/+/&_111/' passwd     root_111:x:0:0:root:/root:/bin/bashbin_111:x:1:1:bin:/bin:/sbin/nologindaemon_111:x:2:2:daemon:/sbin:/sbin/nologinadm_111:x:3:4:adm:/var/adm:/sbin/nologinlp_111:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync_111:x:5:0:sync:/sbin:/bin/syncshutdown_111:x:6:0:shutdown:/sbin:/sbin/shutdownhalt_111:x:7:0:halt:/sbin:/sbin/haltmail_111:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator_111:x:11:0:operator:/root:/sbin/nologingames_111:x:12:100:games:/usr/games:/sbin/nologinftp_111:x:14:50:FTP User:/var/ftp:/sbin/nologinnobody_111:x:99:99:Nobody:/:/sbin/nologin

注意了上面的+号前面加了转义字符,这是为什么呢,因为在sed中 问号、加号、圆括号、花括号和竖线没有特殊含义,就代表字符本身如果要原本定义的实现特殊含义,需要用反斜杠(/)转义

大小写转换:(元字符/u /l /U /L 转换为大/小写字符)
将每行的第一个字符转换为大写

[[email protected] ~]$ sed 's/^[a-z_-]/+//u&/' passwd     Root:x:0:0:root:/root:/bin/bashBin:x:1:1:bin:/bin:/sbin/nologinDaemon:x:2:2:daemon:/sbin:/sbin/nologinAdm:x:3:4:adm:/var/adm:/sbin/nologinLp:x:4:7:lp:/var/spool/lpd:/sbin/nologinSync:x:5:0:sync:/sbin:/bin/syncShutdown:x:6:0:shutdown:/sbin:/sbin/shutdownHalt:x:7:0:halt:/sbin:/sbin/haltMail:x:8:12:mail:/var/spool/mail:/sbin/nologinOperator:x:11:0:operator:/root:/sbin/nologinGames:x:12:100:games:/usr/games:/sbin/nologinFtp:x:14:50:FTP User:/var/ftp:/sbin/nologin

将文件夹下的txt文件的文件名转换为大写

[[email protected] ~]$ ls *.txtaa.txt  info.txt  qq.txt[[email protected] ~]$ ls *.txt | sed -e 's/^/w/+//U&/'AA.txtINFO.txtQQ.txt

替换命令中组() 的用法: /1 /2 /3获取passwd中 USER UID 和 GID

[[email protected] ~]$ cat passwd root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologinftp:x:14:50:FTP User:/var/ftp:/sbin/nologinnobody:x:99:99:Nobody:/:/sbin/nologin[[email protected] ~]$ sed 's//(^[a-z1-9._-]/+/):x:/([0-9]/+/):/([0-9]/+/).*/USER:/1    UID:/2    GID:/3/' passwd USER:root    UID:0    GID:0USER:bin    UID:1    GID:1USER:daemon    UID:2    GID:2USER:adm    UID:3    GID:4USER:lp    UID:4    GID:7USER:sync    UID:5    GID:0USER:shutdown    UID:6    GID:0USER:halt    UID:7    GID:0USER:mail    UID:8    GID:12USER:operator    UID:11    GID:0USER:games    UID:12    GID:100USER:ftp    UID:14    GID:50USER:nobody    UID:99    GID:99

输出eth0网卡的IP地址信息:

[[email protected] ~]$ ifconfig eth0eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500        inet 172.10.10.10  netmask 255.255.254.0  broadcast 172.31.31.255        inet6 fe80::a830:5bff:fe3a:4cb4  prefixlen 64  scopeid 0x20<link>        ether aa:30:5b:3a:4c:b4  txqueuelen 1000  (Ethernet)        RX packets 201374082  bytes 54478001978 (50.7 GiB)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 148223759  bytes 26295570488 (24.4 GiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0[[email protected] ~]$ ifconfig eth0 |grep -E 'inet ' | sed 's/inet /([0-9.]/+/) .*//1/'         172.10.10.10

-r : 复制指定文件插入到匹配行 sed 'pattern r resourcefile' target 读取resourcefile中的内容 插入到target的pattern的匹配行中进行展示-w : 复制匹配行拷贝到指定文件里 sed 'pattern w targetfile' sourcefile 将sourcefile中指定pattern行 ,覆写入targetfile中

q 提前退出sed

[[email protected] ~]$ nl passwd |sed '5q'     1  root:x:0:0:root:/root:/bin/bash     2  bin:x:1:1:bin:/bin:/sbin/nologin     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin     4  adm:x:3:4:adm:/var/adm:/sbin/nologin     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin[[email protected] ~]$ nl passwd |sed '/mail/q'                                                                            1  root:x:0:0:root:/root:/bin/bash     2  bin:x:1:1:bin:/bin:/sbin/nologin     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin     4  adm:x:3:4:adm:/var/adm:/sbin/nologin     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin     6  sync:x:5:0:sync:/sbin:/bin/sync     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown     8  halt:x:7:0:halt:/sbin:/sbin/halt     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin[[email protected] ~]$ 

awk命令 —— 文本与数据处理工具(可编程/统计 制表 及更多功能)

awk的处理方式

  • awk一次处理一行内容
  • awk可以对每行可以切片处理
awk '{print $1}'  // 输出首个单词

awk格式

  • 命令行格式 $awk [options] 'command' file(s)
  • 脚本格式 $awk f awk-script-file file(s)

命令行格式

  • 基本格式
  • 扩展格式
基本格式

$awk [options] 'command' file(s) //awk基本格式主要包括两部分,一是options参数 二是command 命令
command : pattern {awk 操作命令} // command命令包括两部分,一是 pattern(模式) 二是 操作命令
pattern : 正则表达式;逻辑判断式 . // 模式可以由 正则表达式和逻辑判断式组成
command操作命令:由大括号括起,它不像sed中只使用简单的命令,也可以使用内置的函数,也可以使用控制指令if else while等等
内置函数:print() prinf() getline....
控制指令:if(){...}else{...} ; while(){...}

awk内置变量及参数应用
  1. awk内置变量1
    $0 : 整个当前行
    $1 : 每行第一个字段
    $2 : 每行第二个字段
  2. awk内置参数1:分隔符 -F
    options : -F file-separator(默认为空格)
[root@vm1 ~]# awk -F ':' '{print $1  $3}' passwd   // 默认print的输出 username 与uid 是连在一起的root0bin1daemon2adm3lp4sync5shutdown6halt7mail8[root@vm1 ~]# awk -F ':' '{print $1,$3}' passwd   // 如果想让他们分割显示可以中间加逗号, 逗号的分割字符是空格root 0bin 1daemon 2adm 3lp 4sync 5shutdown 6halt 7mail 8[root@vm1 ~]# awk -F ':' '{print $1"/t "$3}' passwd   // 也可以在print语句的输出中间加入其它字符串root	 0bin	 1daemon	 2adm	 3lp	 4sync	 5shutdown	 6halt	 7mail	 8[root@vm1 ~]# awk -F ':' '{print "USER:"$1"/t ""UID:"$3}' passwd USER:root	 UID:0USER:bin	 UID:1USER:daemon	 UID:2USER:adm	 UID:3USER:lp	 UID:4USER:sync	 UID:5USER:shutdown	 UID:6USER:halt	 UID:7USER:mail	 UID:8
  1. awk内置变量2
    NR:每行的记录行号 Number Of RecordNF:每行的字段总数 Number Of FieldFILENAME:正在处理的文件名
[root@vm1 ~]# awk -F ':' '{print NR,NF}' passwd  // 分别打印行号和字段总数1 72 73 74 75 76 77 78 79 7
案例使用

案例一:显示/etc/passwd 每行的行号,每行列数和对应行的用户名(print,printf)

[root@vm1 ~]# awk -F ':' '{print "LINE: "NR,"COL: "NF,"USER:"$1}' passwd LINE: 1 COL: 7 USER:rootLINE: 2 COL: 7 USER:binLINE: 3 COL: 7 USER:daemonLINE: 4 COL: 7 USER:admLINE: 5 COL: 7 USER:lpLINE: 6 COL: 7 USER:syncLINE: 7 COL: 7 USER:shutdownLINE: 8 COL: 7 USER:haltLINE: 9 COL: 7 USER:mail[root@vm1 ~]# awk -F ':' '{printf("LINE:%3s COL:%s USER:%s/n" , NR,NF,$1)}' passwd   // printf 函数式输出LINE:  1 COL:7 USER:rootLINE:  2 COL:7 USER:binLINE:  3 COL:7 USER:daemonLINE:  4 COL:7 USER:admLINE:  5 COL:7 USER:lpLINE:  6 COL:7 USER:syncLINE:  7 COL:7 USER:shutdownLINE:  8 COL:7 USER:haltLINE:  9 COL:7 USER:mail

案例二:显示passwd中用户ID大于100的行号和用户名(if...else...)

[root@vm1 ~]#  awk -F ':' '{if($3>100) print "Line: "NR , "USER: "$1}' passwd Line: 17 USER: usbmuxdLine: 19 USER: rtkitLine: 20 USER: avahi-autoipdLine: 22 USER: abrtLine: 24 USER: nfsnobodyLine: 28 USER: saslauthLine: 31 USER: pulseLine: 34 USER: zhubo

找出文件中Manager的薪水,并打印

[root@vm1 opt]# cat employee.txt 100  Thomas  Manager    Sales       $5,000  200  Jason   Developer  Technology  $5,500  300  Raj     Sysadmin   Technology  $7,000  400  Nisha   Manager    Marketing   $9,500  500  Randy   Manager    Sales       $6,000[root@vm1 opt]# sed -n '/Manager/p' employee.txt | awk '{print $5}'$5,000$9,500$6,000[root@vm1 opt]# awk '/Manager/{print $5}' employee.txt $5,000$9,500$6,000[root@vm1 opt]# 
awk逻辑判断式

~ !~ : 匹配正则表达式
== , != , < , > : 判断逻辑表达式

[root@vm1 ~]# awk -F ':' '$1~/^r.*/{print $1}' passwd rootrpcrtkitrpcuser [root@vm1 ~]# awk -F ':' '$1!~/^r.*/{print $1}' passwd  // 取反bindaemonadmlpsyncshutdown[root@vm1 ~]# awk -F ':' '$3>100{print $1,$3}' passwd  // uid > 100usbmuxd 113rtkit 499avahi-autoipd 170abrt 173nfsnobody 65534saslauth 498pulse 497zhubo 500
扩展格式

$ awk [options] 'commands' file(s)command2扩展 : BEGIN{print "start"}pattern{commands}END{print "end"} BEGIN是在循环之前执行 END是在循环之后执行不参与循环得过程
案例一:显示passwd中每行行号,每行的列数,对应行的用户名

[root@vm1 ~]# awk -F ':' 'BEGIN{print "Line   Col   User"}{print NR,NF,$1}END{print "------"FILENAME"-----"}' passwd Line   Col   User1 7 root2 7 bin3 7 daemon4 7 adm5 7 lp6 7 sync7 7 shutdown8 7 halt9 7 mail10 7 uucp11 7 operator12 7 games------passwd-----

案例一: 统计当前文件夹下的文件/文件夹占用大小

[root@vm1 ~]# ls -l总用量 104-rw-------. 1 root root  1609 7月   7 18:41 anaconda-ks.cfg-rw-r--r--. 1 root root 46478 7月   7 18:41 install.log-rw-r--r--. 1 root root 10033 7月   7 18:39 install.log.syslog-rw-r--r--. 1 root root  1620 12月 10 21:19 passwddrwxr-xr-x. 2 root root  4096 7月   7 10:53 公共的drwxr-xr-x. 2 root root  4096 7月   7 10:53 模板drwxr-xr-x. 2 root root  4096 7月   7 10:53 视频drwxr-xr-x. 2 root root  4096 7月   7 10:53 图片drwxr-xr-x. 2 root root  4096 7月   7 10:53 文档drwxr-xr-x. 2 root root  4096 7月   7 10:53 下载drwxr-xr-x. 2 root root  4096 7月   7 10:53 音乐drwxr-xr-x. 2 root root  4096 7月   7 10:53 桌面[root@vm1 ~]# ls -l | awk 'BEGIN{size=0}{size+=$5}END{print "size is "size}'size is 92508[root@vm1 ~]# ls -l | awk 'BEGIN{size=0}{size+=$5}END{print "size is "size/1024"K"}'size is 90.3398K

案例二:统计显示passwd的账户总人数

[root@vm1 ~]# awk -F ':' 'BEGIN{count=0}$1!~/^$/{count++}END{print count}' passwd  //排除空行34

统计UID>100的账户总人数

[root@vm1 ~]# awk -F ':' 'BEGIN{count=0}{if ($3>100) name[count++]=$1}END{for(i=0;i<count;i++) print i,name[i]}' passwd 0 usbmuxd1 rtkit2 avahi-autoipd3 abrt4 nfsnobody5 saslauth6 pulse7 zhubo

案例三: 统计netstat -amp 状态下 LISTEN和CONNECTED的连接状态

[root@vm1 ~]# netstat -anpProto RefCnt Flags       Type       State         I-Node PID/Program name    Pathunix  2      [ ]     STREAM     LISTENING     15997  2268/gnome-session  @/tmp/.ICE-unix/2268unix  2      [ ]     STREAM     LISTENING     15723  2181/Xorg           /tmp/.X11-unix/X0unix  2      [ ]     STREAM     LISTENING     15998  2268/gnome-session  /tmp/.ICE-unix/2268unix  2      [ ]     STREAM     LISTENING     16065  2275/gconfd-2       /tmp/orbit-gdm/linc-8e3-0-3681d67c590faunix  2      [ ]     STREAM     LISTENING     16139  2268/gnome-session  /tmp/orbit-gdm/linc-8dc-0-756f0d535b355unix  2      [ ]     STREAM     LISTENING     16240  2295/gnome-settings /tmp/orbit-gdm/linc-8f7-0-2d979a559d723unix  2      [ ]     STREAM     LISTENING     16312  2297/bonobo-activat /tmp/orbit-gdm/linc-8f9-0-3e19569c5dda2unix  3      [ ]         STREAM     CONNECTED     16738  1622/dbus-daemon    /var/run/dbus/system_bus_socketunix  3      [ ]         STREAM     CONNECTED     16737  2317/polkitd        unix  3      [ ]         STREAM     CONNECTED     16653  1622/dbus-daemon    /var/run/dbus/system_bus_socketunix  3      [ ]         STREAM     CONNECTED     16652  2311/polkit-gnome-a unix  3      [ ]         STREAM     CONNECTED     16747  2311/polkit-gnome-a /tmp/orbit-gdm/linc-907-0-116ec6d6f190funix  3      [ ]         STREAM     CONNECTED     16649  2294/at-spi-registr unix  3      [ ]         STREAM     CONNECTED     16646  2294/at-spi-registr /tmp/orbit-gdm/linc-8f6-0-3a2c08ec5e139unix  3      [ ]         STREAM     CONNECTED     16645  2311/polkit-gnome-a unix  3      [ ]         STREAM     CONNECTED     16642  2181/Xorg           @/tmp/.X11-unix/X0unix  3      [ ]         STREAM     CONNECTED     16641  2311/polkit-gnome-a unix  3      [ ]         STREAM     CONNECTED     16633  2309/gnome-power-ma /[root@vm1 ~]# netstat -anp | awk '$6~/CONNECTED|LISTEN/{sum[$6]++}END{for(i in sum) print i , sum[i]}'CONNECTED 226LISTEN 12

赞赏支持

广告 广告

评论区