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

栏目: 服务器 · 发布时间: 7年前

内容简介:上面是对单个字符的重复,如果对字符串的重复可以使用() 其中,括号使用在字符串中时加上\(se)* 如 : grep '\(se\)*' passwd(se)+ 如 : grep '\(se\)\+' passwd

文本处理工具 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 awk sed完全解读 原 荐

正则练习

  • 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

[bozhu@l-xxxxxx.rd.xxxxxx.cn2 ~]$ nl passwd | sed -n '1,2p'  -- 静默输出
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/sbin/nologin
[bozhu@l-xxxxxx.rd.xxxxxx.cn2 ~]$ 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
     .......
[bozhu@l-xdriverm1.rd.beta.cn2 ~]$ 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 :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
  • p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
[bozhu@l-xxxx.xxxx.xxxx.cn2 ~]$ 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
-- '\' 为操作命令和额外参数的间隔符 例如行前加空格对其的情况
[bozhu@l-xxxx.xxxx.xxxx.xxxx ~]$ 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
[bozhu@l-xxxx.rd.xxxx.xxxx ~]$ 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
[bozhu@l-xxxx.xxxx.xxxx.xxxx ~]$ 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
[zhubo@l-xxxx.xx.xx.x$ 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
[zhubo@l-xxxxx.xx.xx.xx ~]$ 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
-- 删除空行展示
[zhubo@l-xxxx.xx.xx.x$ 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部分:

[zhubo@l-pb-xxx.xx.cn1 /home/tomcat/logs]$ grep -iE 'ERROR' info
2018-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 failed
2018-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 failed
2018-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 failed
2018-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 failed
2018-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 failed
2018-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 failed
2018-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 failed
2018-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 failed
2018-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 failed
2018-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 failed
2018-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 failed
2018-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 failed
2018-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的部分输出:

[zhubo@l-xxxx-xxxxx.xx.xxx ~]$ grep -iE 'ERROR' info | sed -n 's/.*\[//p' | sed -n 's/\].*//p' 
66.225.251.170
172.105.240.169
171.97.148.2
122.155.45.101
95.134.248.53
27.1.208.41
182.68.246.99
65.74.21.178
37.142.242.98
......

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

[bozhu@l-location-service1.rd.cn1 ~]$ grep -iE 'ERROR' info | sed '{s/.*\[//;s/\].*//}'              
66.225.251.170
172.105.240.169
171.97.148.2
122.155.45.101
95.134.248.53
27.1.208.41
....

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

其中&为被取代的字符串

[bozhu@l-location-service1.rd.cn1 ~]$ cat 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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
bozhu  :x:49012:1005::/home/bozhu:/bin/bash

[bozhu@l-location-service1.rd.cn1 ~]$ sed 's/^[a-z_-]\+/&_111/' passwd     
root_111:x:0:0:root:/root:/bin/bash
bin_111:x:1:1:bin:/bin:/sbin/nologin
daemon_111:x:2:2:daemon:/sbin:/sbin/nologin
adm_111:x:3:4:adm:/var/adm:/sbin/nologin
lp_111:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync_111:x:5:0:sync:/sbin:/bin/sync
shutdown_111:x:6:0:shutdown:/sbin:/sbin/shutdown
halt_111:x:7:0:halt:/sbin:/sbin/halt
mail_111:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator_111:x:11:0:operator:/root:/sbin/nologin
games_111:x:12:100:games:/usr/games:/sbin/nologin
ftp_111:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody_111:x:99:99:Nobody:/:/sbin/nologin

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

大小写转换:(元字符\u \l \U \L 转换为大/小写字符)

将每行的第一个字符转换为大写

[bozhu@l-xxxx-xxxx.xxxx.xxxx ~]$ sed 's/^[a-z_-]\+/\u&/' 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
Sync:x:5:0:sync:/sbin:/bin/sync
Shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
Halt:x:7:0:halt:/sbin:/sbin/halt
Mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
Operator:x:11:0:operator:/root:/sbin/nologin
Games:x:12:100:games:/usr/games:/sbin/nologin
Ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

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

[bozhu@l-xxxxx-xxxxx.xxxxx.xxxxx ~]$ ls *.txt
aa.txt  info.txt  qq.txt
[bozhu@l-xxxxx-xxxxx.xxxxx.xxxxx ~]$ ls *.txt | sed -e 's/^\w\+/\U&/'
AA.txt
INFO.txt
QQ.txt

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

[bozhu@l-xxxxx-xxxxx.xxxxx.xxxxx ~]$ cat 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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
[bozhu@l-location-service1.rd.cn1 ~]$ sed 's/\(^[a-z1-9._-]\+\):x:\([0-9]\+\):\([0-9]\+\).*/USER:\1    UID:\2    GID:\3/' passwd 
USER:root    UID:0    GID:0
USER:bin    UID:1    GID:1
USER:daemon    UID:2    GID:2
USER:adm    UID:3    GID:4
USER:lp    UID:4    GID:7
USER:sync    UID:5    GID:0
USER:shutdown    UID:6    GID:0
USER:halt    UID:7    GID:0
USER:mail    UID:8    GID:12
USER:operator    UID:11    GID:0
USER:games    UID:12    GID:100
USER:ftp    UID:14    GID:50
USER:nobody    UID:99    GID:99

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

[bozhu@l-xxxxx-xxxxx.xxxxx.xxxxx ~]$ ifconfig eth0
eth0: 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
[bozhu@l-xxxxx-xxxxx.xxxxx.xxxxx ~]$ 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

[bozhu@l-xxxxx-xxxxx.xxxxx.xxxxx ~]$ 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
[bozhu@l-xxxxx-xxxxx.xxxxx.xxxxx ~]$ 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
[bozhu@l-xxxxx-xxxxx.xxxxx.xxxxx ~]$

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 是连在一起的
root0
bin1
daemon2
adm3
lp4
sync5
shutdown6
halt7
mail8
[root@vm1 ~]# awk -F ':' '{print $1,$3}' passwd   // 如果想让他们分割显示可以中间加逗号, 逗号的分割字符是空格
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8
[root@vm1 ~]# awk -F ':' '{print $1"\t "$3}' passwd   // 也可以在print语句的输出中间加入其它字符串
root	 0
bin	 1
daemon	 2
adm	 3
lp	 4
sync	 5
shutdown	 6
halt	 7
mail	 8
[root@vm1 ~]# awk -F ':' '{print "USER:"$1"\t ""UID:"$3}' passwd 
USER:root	 UID:0
USER:bin	 UID:1
USER:daemon	 UID:2
USER:adm	 UID:3
USER:lp	 UID:4
USER:sync	 UID:5
USER:shutdown	 UID:6
USER:halt	 UID:7
USER:mail	 UID:8
  1. awk内置变量2

    NR:每行的记录行号 Number Of Record NF:每行的字段总数 Number Of Field FILENAME:正在处理的文件名

[root@vm1 ~]# awk -F ':' '{print NR,NF}' passwd  // 分别打印行号和字段总数
1 7
2 7
3 7
4 7
5 7
6 7
7 7
8 7
9 7

案例使用

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

[root@vm1 ~]# awk -F ':' '{print "LINE: "NR,"COL: "NF,"USER:"$1}' passwd 
LINE: 1 COL: 7 USER:root
LINE: 2 COL: 7 USER:bin
LINE: 3 COL: 7 USER:daemon
LINE: 4 COL: 7 USER:adm
LINE: 5 COL: 7 USER:lp
LINE: 6 COL: 7 USER:sync
LINE: 7 COL: 7 USER:shutdown
LINE: 8 COL: 7 USER:halt
LINE: 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:root
LINE:  2 COL:7 USER:bin
LINE:  3 COL:7 USER:daemon
LINE:  4 COL:7 USER:adm
LINE:  5 COL:7 USER:lp
LINE:  6 COL:7 USER:sync
LINE:  7 COL:7 USER:shutdown
LINE:  8 COL:7 USER:halt
LINE:  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: usbmuxd
Line: 19 USER: rtkit
Line: 20 USER: avahi-autoipd
Line: 22 USER: abrt
Line: 24 USER: nfsnobody
Line: 28 USER: saslauth
Line: 31 USER: pulse
Line: 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 
root
rpc
rtkit
rpcuser 
[root@vm1 ~]# awk -F ':' '$1!~/^r.*/{print $1}' passwd  // 取反
bin
daemon
adm
lp
sync
shutdown
[root@vm1 ~]# awk -F ':' '$3>100{print $1,$3}' passwd  // uid > 100
usbmuxd 113
rtkit 499
avahi-autoipd 170
abrt 173
nfsnobody 65534
saslauth 498
pulse 497
zhubo 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   User
1 7 root
2 7 bin
3 7 daemon
4 7 adm
5 7 lp
6 7 sync
7 7 shutdown
8 7 halt
9 7 mail
10 7 uucp
11 7 operator
12 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 passwd
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 音乐
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 usbmuxd
1 rtkit
2 avahi-autoipd
3 abrt
4 nfsnobody
5 saslauth
6 pulse
7 zhubo

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

[root@vm1 ~]# netstat -anp
Proto RefCnt Flags       Type       State         I-Node PID/Program name    Path
unix  2      [ ]     STREAM     LISTENING     15997  2268/gnome-session  @/tmp/.ICE-unix/2268
unix  2      [ ]     STREAM     LISTENING     15723  2181/Xorg           /tmp/.X11-unix/X0
unix  2      [ ]     STREAM     LISTENING     15998  2268/gnome-session  /tmp/.ICE-unix/2268
unix  2      [ ]     STREAM     LISTENING     16065  2275/gconfd-2       /tmp/orbit-gdm/linc-8e3-0-3681d67c590fa
unix  2      [ ]     STREAM     LISTENING     16139  2268/gnome-session  /tmp/orbit-gdm/linc-8dc-0-756f0d535b355
unix  2      [ ]     STREAM     LISTENING     16240  2295/gnome-settings /tmp/orbit-gdm/linc-8f7-0-2d979a559d723
unix  2      [ ]     STREAM     LISTENING     16312  2297/bonobo-activat /tmp/orbit-gdm/linc-8f9-0-3e19569c5dda2
unix  3      [ ]         STREAM     CONNECTED     16738  1622/dbus-daemon    /var/run/dbus/system_bus_socket
unix  3      [ ]         STREAM     CONNECTED     16737  2317/polkitd        
unix  3      [ ]         STREAM     CONNECTED     16653  1622/dbus-daemon    /var/run/dbus/system_bus_socket
unix  3      [ ]         STREAM     CONNECTED     16652  2311/polkit-gnome-a 
unix  3      [ ]         STREAM     CONNECTED     16747  2311/polkit-gnome-a /tmp/orbit-gdm/linc-907-0-116ec6d6f190f
unix  3      [ ]         STREAM     CONNECTED     16649  2294/at-spi-registr 
unix  3      [ ]         STREAM     CONNECTED     16646  2294/at-spi-registr /tmp/orbit-gdm/linc-8f6-0-3a2c08ec5e139
unix  3      [ ]         STREAM     CONNECTED     16645  2311/polkit-gnome-a 
unix  3      [ ]         STREAM     CONNECTED     16642  2181/Xorg           @/tmp/.X11-unix/X0
unix  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 226
LISTEN 12

公众号

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


以上所述就是小编给大家介绍的《文本处理工具 grep awk sed完全解读 原 荐》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Inside Larry's and Sergey's Brain

Inside Larry's and Sergey's Brain

Richard Brandt / Portfolio / 17 Sep 2009 / USD 24.95

You’ve used their products. You’ve heard about their skyrocketing wealth and “don’t be evil” business motto. But how much do you really know about Google’s founders, Larry Page and Sergey Brin? Inside......一起来看看 《Inside Larry's and Sergey's Brain》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具