1.grep

语法格式: 
     grep '字符串'  file
     其他命令输出|grep '字符串'
参数选项: 
   -v  取反
   -r  递归过滤
   -i  不区分大小写
   -E  支持扩展正则
   -w  过滤单词(以空格为分隔)
   -o  查看匹配过程
   -c  统计单词数量
   -n  显示过滤到内容的行号
   -A5  显示过滤到内容的下5行
   -B5  显示过滤到内容的上5行
   -C5  显示过滤到内容的上下各5行
-r递归过滤:    
[root@linuxsd opt]# grep -r 'linuxsd' * 
1.txt:www.linuxsd.com
oldboy/code.txt:www.linuxsd.com

-w用法: 
[root@linuxsd opt]# cat 2.txt
oldboy1123
oldboy
test
test123
oldboy
[root@linuxsd opt]# grep 'oldboy' 2.txt
oldboy1123
oldboy
oldboy
[root@linuxsd opt]# grep -w 'oldboy' 2.txt
oldboy
oldboy

-c 统计过滤到内容的数量: 
[root@linuxsd opt]# grep -c 'oldboy' 2.txt
3

-n  显示过滤到内容的行号  
[root@linuxsd opt]# grep -n 'test' 2.txt 
3:test
4:test123


[root@linuxsd opt]# grep -A5 '5' 1.txt 
5
6
7
8
9
10
[root@linuxsd opt]# grep -B5 '5' 1.txt 
2
111
123
3
4
5

2.sed

语法格式: 
    sed  '模式 动作' file
    sed  -n '5,10p' file  # 逗号为区间范围
    模式:  找谁 如何找 找行 找第几行
    动作: 干啥 输出 删除 增加内容
    sed -n 取消默认输出(在查找内容时)
    sed -r  支持扩展正则
    sed -n '//,//p' file
作用: 
 1.替换字符
 2.模糊过滤
 3.后向引用(格式化输出)
案例1: 过滤出文件的第3行   
 [root@linuxsd ~]# sed -n '3p' test.txt 
 3    daemon:x:2:2:daemon:/sbin:/sbin/nologin
案例2: 显示最后一行 
[root@linuxsd ~]# sed -n '$p' test.txt 
10    operator:x:11:0:operator:/root:/sbin/nologin

案例3: 显示5-最后一行 区间范围, 
 [root@linuxsd ~]# sed -n '5,$p' test.txt 
 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  

案例4: 模糊查找 
[root@linuxsd ~]# sed -n '/root/p' test.txt 
 1    root:x:0:0:root:/root:/bin/bash
10    operator:x:11:0:operator:/root:/sbin/nologin
案例5: 查找以sh结尾的行 
 [root@linuxsd ~]# sed -n '/sh$/p' test.txt 
 1    root:x:0:0:root:/root:/bin/bash    
案例6: 查找以shut开头的行 
[root@linuxsd ~]# cat oldboy.txt 
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
[root@linuxsd ~]# sed -n '/^shut/p' oldboy.txt 
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 
案例7.查找包含root或者shut的行 
[root@linuxsd ~]# sed -rn '/shut|root/p' oldboy.txt 
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 
operator:x:11:0:operator:/root:/sbin/nologin
案例8.模糊过滤查找区间范围 
[root@linuxsd ~]# sed -n '/adm/,/shut/p' oldboy.txt
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
区间范围的注意事项: 
[root@linuxsd ~]# cat 2.txt
test
aaa
bbb
oldboy
ccc
ddd
test
yyyy
uuuu
[root@linuxsd ~]# sed -n '/test/,/oldboy/p' 2.txt 
test
aaa
bbb
oldboy
test
yyyy
3uuuu
第二种清空: 
[root@linuxsd ~]# cat 2.txt
test
aaa
bbb
oldboy
ccc
ddd
yyyy
oldboy
uuuu
[root@linuxsd ~]# sed -n '/test/,/oldboy/p' 2.txt 
test
aaa
bbb
oldboy
案例: 在企业中常用 过滤时间的区间范围 需求 帮我统计日志上午10点到12点的数据总共行数
将时间视为字符串进行区间匹配
[root@linuxsd ~]# sed -n '/Jul 13 10:01:01/,/Jul 13 11:44:47/p' /var/log/messages|wc -l
15

2.1 sed之删除命令

语法结构: 
    sed 'nd' file    删除文件的第n行 不影响源文件
    sed -i 'nd' file 删除源文件的第n行
    sed '3,5d' file  删除指定行的范围
    sed '/字符串/d'  模糊过滤删除
    sed '/字符串/,/字符串/d'     删除区间范围
案例1: 删除文件的第5行
[root@linuxsd ~]# sed '5d' oldboy.txt 
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
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
案例2: 删除5到最后一行 
[root@linuxsd ~]# sed '5,$d' oldboy.txt
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
案例3: 删除包含shutdown的行 
[root@linuxsd ~]# sed '/shut/d' oldboy.txt
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
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
案例4: 真正的删除源文件的以bin开头的行 
[root@linuxsd ~]# sed -i '/^bin/d' oldboy.txt
[root@linuxsd ~]# cat oldboy.txt
root:x:0:0:root:/root:/bin/bash
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

案例5: 按区间范围删除
语法结构:
    sed 'nd' file    删除文件的第n行 不影响源文件
    sed -i 'nd' file 删除源文件的第n行
    sed '3,5d' file  删除指定行的范围
    sed '/字符串/d'  模糊过滤删除
    sed '/字符串/,/字符串/d'     删除区间范围
案例1: 删除文件的第5行
[root@linuxsd ~]# sed '5d' oldboy.txt 
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
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

案例2: 删除5到最后一行
[root@linuxsd ~]# sed '5,$d' oldboy.txt
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

案例3: 删除包含shutdown的行
[root@linuxsd ~]# sed '/shut/d' oldboy.txt
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
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

案例4: 真正的删除源文件的以bin开头的行
[root@linuxsd ~]# sed -i '/^bin/d' oldboy.txt
[root@linuxsd ~]# cat oldboy.txt 
root:x:0:0:root:/root:/bin/bash
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

案例5: 按区间范围删除
[root@linuxsd ~]# sed '/adm/,/halt/d' oldboy.txt
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

2.2sed增加内容或者将内容写入到文件中

sed之增加内容
语法结构:
          sed '3a 字符串' file # 在第三行的下面插入字符串
          sed '3i 字符串' file # 在第三行处插入字符串
          sed '3c 字符串' file # 替换第3行为字符串 掌握
          sed '3w 1.txt' file # 将第3行的内容写入到1.txt文件中
          sed -i 修改源文件的内容
          
案例1.在第3行的下面插入aaaaaa
  [root@linuxsd ~]# sed '3a 123456' 2.txt 
  test
  aaaa
  oldboy
  123456
  ccc
  ddd
  yyyy
  oldboy
  uuuu
案例2: 在当前的位置插入
  [root@linuxsd ~]# sed '3i 123456' 2.txt 
  test
  aaaa
  123456
  oldboy
  ccc
  ddd
  yyyy
  oldboy
  uuuu   
  
案例3: 替换当前整行内容 重要
  [root@linuxsd ~]# sed '3c 123456' 2.txt 
  test
  aaaa
  123456
  ccc
  ddd
  yyyy
  oldboy
  uuuu  
  
企业案例: 替换整行
[root@linuxsd ~]# sed -i '7c SELINUX=disabled' /etc/selinux/config

案例4.将文件的第3行重新写入到1.txt文件中
[root@linuxsd ~]# sed '3w 1.txt' 2.txt
test
aaaa
oldboy
ccc
ddd
yyyy
oldboy
uuuu
[root@linuxsd ~]# cat 1.txt 
oldboy

2.3 sed替换文件内容

语法格式:
          sed 's#字符串#替换成谁#g' file
          sed 's///g'  file
          sed 's@@@g'  file
          sed 's###' file  
          
              边界的两种方 \b、\<字符串\>
          
案例1.替换root为oldboy
  [root@linuxsd ~]# sed 's#root#oldboy#g' oldboy.txt
  oldboy:x:0:0:oldboy:/oldboy:/bin/bash
  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
  :x:8:12:mail:/var/spool/mail:/sbin/nologin
  operator:x:11:0:operator:/oldboy:/sbin/nologin    
  
案例2.s### 替换 不是全局替换 只替换每行的第一个root
  [root@linuxsd ~]# sed 's#root#oldboy#' oldboy.txt
  oldboy:x:0:0:root:/root:/bin/bash
  daemon:x:2:2:daemon:/sbin:/sbin/nolo    
  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:/oldboy:/sbin/nologin
  
案例3: 将bin替换成oldboy \b边界 (过滤身份证号)
  [root@linuxsd ~]# sed 's#\bbin\b#oldboy#g' oldboy.txt
  root:x:0:0:root:/root:/oldboy/bash
  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:/binnn/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  
  
边界的另一种表示方式: \<字符串\>
  [root@linuxsd ~]# sed 's#\<bin\>#oldboy#g' oldboy.txt
  root:x:0:0:root:/root:/oldboy/bash
  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:/binnn/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
  
案例4: 替换文件中的/bin 为oldboy 遇到替换/时 只需要格式变化 ###
[root@linuxsd ~]# sed 's/\/bin/oldboy/g' oldboy.txt 
  root:x:0:0:root:/root:oldboy/bash
  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:oldboynn/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
[root@linuxsd ~]# sed 's#/bin#oldboy#g' oldboy.txt

案例5: 删除文件中所有的数字
[root@linuxsd ~]# sed 's#[0-9]##g' oldboy.txt
  root:x:::root:/root:/bin/bash
  daemon:x:::daemon:/sbin:/sbin/nologin
  adm:x:::adm:/var/adm:/sbin/nologin
  lp:x:::lp:/var/spool/lpd:/sbin/nologin
  sync:x:::sync:/sbin:/binnn/sync
  shutdown:x:::shutdown:/sbin:/sbin/shutdown
  halt:x:::halt:/sbin:/sbin/halt
  mail:x:::mail:/var/spool/mail:/sbin/nologin
  operator:x:::operator:/root:/sbin/nologin
  
删除文件中所有的字母
[root@linuxsd ~]# sed 's#[a-Z]##g' oldboy.txt
  ::0:0::/://
  ::2:2::/://
  ::3:4:://://
  ::4:7::///://
  ::5:0::/://
  ::6:0::/://
  ::7:0::/://
  ::8:12::///://
  ::11:0::/://  
  
删除字母和数字
[root@linuxsd ~]# sed 's#[a-Z0-9]##g' oldboy.txt
  :::::/://
  :::::/://
  ::::://://
  :::::///://
  :::::/://
  :::::/://
  :::::/://
  :::::///://
  :::::/://  

删除特殊符号和x和数字 只留字母
[root@linuxsd ~]# sed 's#[0-9/:x]# #g' oldboy.txt|xargs -n1|sort |uniq -c|sort -rn|grep -o
     11 sbin
      5 nologin
      4 root
      3 var
      3 sync
      3 shutdown
删除特殊符号和x和数字 只留单个字符      
[root@linuxsd ~]# sed 's#[0-9/:x]# #g' oldboy.txt|egrep -o '[a-z]'|sort |uniq -c|sort -rn|head -5
  80 n
  71 o
  62 s
  54 i
  39 t
  
正则取反:
[root@linuxsd ~]# sed -r 's#[^a-Z]|x# #g' oldboy.txt 
  root       root  root  bin bash
  daemon       daemon  sbin  sbin nologin
  adm       adm  var adm  sbin nologin
  lp       lp  var spool lpd  sbin nologin
  sync       sync  sbin  binnn sync
  shutdown       shutdown  sbin  sbin shutdown
  halt       halt  sbin  sbin halt
  mail        mail  var spool mail  sbin nologin
  operator        operator  root  sbin nologin  

注意: 正则中的任意或者连续
[root@linuxsd ~]# cat hehe.txt
  root:x:0:0:root:/root:/bin/bash
[root@linuxsd ~]# sed 's#:/# #g' hehe.txt   :/为连续的
  root:x:0:0:root root bin/bash
  [root@linuxsd ~]# sed 's#[:/]# #g' hehe.txt  :或/任意单个
  root x 0 0 root  root  bin bash

sed之模式+动作
语法结构:
 
 
案例1: 将第行的adm替换成oldboy
[root@linuxsd ~]# sed -n '3p' oldboy.txt
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@linuxsd ~]# sed -n '3s#adm#oldboy#gp' oldboy.txt
oldboy:x:3:4:oldboy:/var/oldboy:/sbin/nologin

案例2: 替换1-3行的bin为A       
[root@linuxsd ~]# sed -n '1,3s#bin#A#gp' oldboy.txt
root:x:0:0:root:/root:/A/bash
daemon:x:2:2:daemon:/sA:/sA/nologin
adm:x:3:4:adm:/var/adm:/sA/nologin

案例3: 模糊过滤+替换动作   '//p'   "p的意思是print打印"
#查找adm开头的行
[root@linuxsd ~]# sed -n '/adm/p' oldboy.txt 
  adm:x:3:4:adm:/var/adm:/sbin/nologin
#adm开头的行把bin换成hehe
[root@linuxsd ~]# sed -n '/adm/s#bin#hehe#gp' oldboy.txt
  adm:x:3:4:adm:/var/adm:/shehe/nologin 
#adm-shut开头的行把bin换成hehe
[root@linuxsd ~]# sed -n '/adm/,/shut/s#bin#hehe#gp' oldboy.txt
adm:x:3:4:adm:/var/adm:/shehe/nologin
lp:x:4:7:lp:/var/spool/lpd:/shehe/nologin
sync:x:5:0:sync:/shehe:/hehenn/sync
shutdown:x:6:0:shutdown:/shehe:/shehe/shutdown

修改源文件不要n和p输出直接i修改源文件
#n和p为输出打印在屏幕上  -i为永久修改
[root@linuxsd ~]# sed -i '/adm/s#bin#hehe#g' oldboy.txt
[root@linuxsd ~]# cat oldboy.txt 
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/shehe/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/binnn/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
2.4 向后引用
[root@linuxsd opt]# echo test oldboy|sed -r 's#(test oldboy)#\1#g'
test oldboy
[root@linuxsd opt]# echo test oldboy|sed -r 's#(test) oldboy#\1#g'
test
[root@linuxsd opt]# echo test oldboy|sed -r 's#(test) (oldboy)#\1#g'
test
[root@linuxsd opt]# echo test oldboy|sed -r 's#(test) (oldboy)#\2#g'
oldboy

向后引用想要谁 就把谁保护起来
[root@linuxsd opt]# echo test oldboy|sed -r 's#(t.*t) (o.*y)#\1#g'
test
[root@linuxsd opt]# 
[root@linuxsd opt]# 
[root@linuxsd opt]# 
[root@linuxsd opt]# echo test oldboy|sed -r 's#(t.*t) (o.*y)#\2#g'
oldboy

格式化输出内容
[root@linuxsd opt]# echo test oldboy|sed -r 's#(t.*t) (o.*y)#useradd \1#g'
useradd test
[root@linuxsd opt]# echo test oldboy|sed -r 's#(t.*t) (o.*y)#useradd \1 passwd#g'
useradd test passwd
[root@linuxsd opt]# echo test oldboy|sed -r 's#(t.*t) (o.*y)#<\1>#g'
<test>

[root@linuxsd opt]# echo test oldboy|sed -r 's#(t.*t) (o.*y)#<\1>\n<\2>#g'
<test>
<oldboy>


案例:
[root@linuxsd opt]# ip add|grep 'eth0$'
    inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0
[root@linuxsd opt]# 
[root@linuxsd opt]# 
[root@linuxsd opt]# ip add|sed -n '/eth0$/p'
    inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0

将所有的字符串写入到替换的位置 将输出的内容保护
[root@linuxsd opt]# ip add|grep 'eth0$'|sed -r 's#inet (10.0.0.200/24) brd 10.0.0.255 scope global noprefixroute eth0#\1#g'
10.0.0.200/24

[root@linuxsd opt]# ip add|grep 'eth0$'|sed -r 's#^.*et (.*) brd.*$#\1#g'
10.0.0.200/24

扩展:
touch 1.txt 2.txt
创建用户:
useradd  oldboy1
[root@linuxsd opt]# useradd oldboy1
[root@linuxsd opt]# cat /etc/passwd

useradd oldboy2
useradd oldboy3
useradd oldboy5

后向引用拼接用户
[root@linuxsd opt]# echo {1..5}|xargs -n1|sed -r 's#(.*)#oldboy\1#g'
oldboy1
oldboy2
oldboy3
oldboy4
oldboy5


[root@linuxsd opt]# echo {1..5}|xargs -n1|sed -r 's#(.*)#useradd oldboy\1#g'
useradd oldboy1
useradd oldboy2
useradd oldboy3
useradd oldboy4
useradd oldboy5

shell将字符串变为可执行命令方式
[root@linuxsd opt]# echo pwd|bash
[root@linuxsd opt]# echo {1..5}|xargs -n1|sed -r 's#(.*)#useradd oldboy\1#g'|bash

3.awk

3.1 awk语法结构

作用:
1.取行
2.取列
3.取行取列
4.数据统计 字符串比较 数字比较
5.格式化输出
6.支持if判断 for循环 while 数组...

语法格式:
         awk '{动作}' 文件  # 只有动作默认处理所有行
         awk '模式'   文件  # 找谁 怎么找 取行 或者 取列
         awk '模式{动作}'   # 找谁 干啥
         awk '{print $1,$5}' file
awk中的逗号为内置的变量: 里面存储着是空格
内置变量:
NR  行号
,  空格
$n  第n列
NF  存储最后一列的列号


awk取行:
语法:    awk 'NR==3' 文件  # 查找指定的行
NR为awk的内置变量,将每行的行号赋值给NR
比较符:
NR==3  等于
NR>3   大于
NR>=3  大于等于3
NR<3   小于
NR<=3  小于等于3
NR!=3  不等于
&&     并且
||     或者

3.2案列awk取行

案例1: 查找出文件的第3行
[root@linuxsd ~]# awk 'NR==3' oldboy.txt 
adm:x:3:4:adm:/var/adm:/shehe/nologin

案例2: 查找出文件的小于3的行
[root@linuxsd ~]# awk 'NR<3' oldboy.txt 
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin

案例3: 查找大于3的所有行
[root@linuxsd ~]# awk 'NR>3' oldboy.txt
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/binnn/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

案例4: 查找大于5并且小于10的行 6-9行
[root@linuxsd ~]# awk 'NR>5&&NR<10' oldboy.txt 
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

案例5: 查找等于1 或者 大于5的行
[root@linuxsd ~]# awk 'NR==1 || NR>5' oldboy.txt
root:x:0:0:root:/root:/bin/bash
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


awk取行
[root@linuxsd ~]# df -h|awk '/\/$/'
/dev/sda3        18G  2.3G   16G  13% /

[root@linuxsd ~]# df -h|awk '/^.*sda3/'
/dev/sda3        18G  2.3G   16G  13% /
awk模糊过滤

awk模糊过滤
语法:    awk '/字符串/' file
         awk '//,//'   file

案例1: 找出包含root的行
[root@linuxsd ~]# awk '/root/' oldboy.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

案例2: 支持正则 查找包含root或者adm的行
[root@linuxsd ~]# awk '/root|adm/' oldboy.txt 
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/shehe/nologin
operator:x:11:0:operator:/root:/sbin/nologin

案例3: 查找以bash结尾的行
[root@linuxsd ~]# awk '/bash$/' oldboy.txt
root:x:0:0:root:/root:/bin/bash

案例4: 查找以adm开头的
[root@linuxsd ~]# awk '/^adm/' oldboy.txt
adm:x:3:4:adm:/var/adm:/shehe/nologin

案例5: 查找root开头到shutdow结尾的
[root@linuxsd ~]# awk '/adm/,/sync/' oldboy.txt
adm:x:3:4:adm:/var/adm:/shehe/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/binnn/sync

3.3 awk取列

语法结构:     awk '{print $n}' file   # n为数字
特点: $n  n从第1列开始取值 以空格或tab键分隔列  $0 为整个文件内容

案例1.取出文件中的第一列
[root@linuxsd ~]# cat 2.txt
test     234
aaaa     234
oldboy   444
ccc      111
ddd      444
yyyy     777
oldboy   234
uuuu   888
[root@linuxsd ~]# awk '{print $1}' 2.txt 
test
aaaa
oldboy
ccc
ddd
yyyy
oldboy
uuuu

案例2.取出文件中的第二列
[root@linuxsd ~]# awk '{print $2}' 2.txt 
234
234
444
111
444
777
234
888

案例3.取出其他命令输出后的第n列
[root@linuxsd ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        980M     0  980M   0% /dev
tmpfs           991M     0  991M   0% /dev/shm
tmpfs           991M  9.5M  981M   1% /run
tmpfs           991M     0  991M   0% /sys/fs/cgroup
/dev/sda3        18G  2.3G   16G  13% /
/dev/sr0        4.4G  4.4G     0 100% /data
/dev/sda1       197M  110M   88M  56% /boot
tmpfs           199M     0  199M   0% /run/user/0
[root@linuxsd ~]# df -h|awk '{print $5}'
Use%
0%
0%
1%
0%
13%
100%
56%
0%



案例4.同时输出第1列和第5列
[root@linuxsd ~]# df -h|awk '{print $1,$5}'
Filesystem Use%
devtmpfs 0%
tmpfs 0%
tmpfs 1%
tmpfs 0%
/dev/sda3 13%
/dev/sr0 100%
/dev/sda1 56%
tmpfs 0%

案例5: 取出文件中的第5行和第1行
[root@linuxsd ~]# df -h|awk '{print $5,$1}'
Use% Filesystem
0% devtmpfs
0% tmpfs
1% tmpfs
0% tmpfs
13% /dev/sda3
100% /dev/sr0
56% /dev/sda1
0% tmpfs

如果想要输出普通字符串和空格可以使用双引号
[root@linuxsd ~]# df -h|awk '{print $5" "$1}'
Use% Filesystem
0% devtmpfs
0% tmpfs
1% tmpfs
0% tmpfs
13% /dev/sda3
100% /dev/sr0
56% /dev/sda1
0% tmpfs

案例6: 输出最后一列 使用NF
[root@linuxsd ~]# df -h|awk '{print $6}'
Mounted
/dev
/dev/shm
/run
/sys/fs/cgroup
/
/data
/boot
/run/user/0

[root@linuxsd ~]# awk '{print $NF}' 2.txt 
234
234
444
111
444
777
234
888

案例7: 输出倒数第2列
[root@linuxsd ~]# awk '{print $0}' 4.txt 
test 234 aaaa  222
234 oldboy 444 666
ccc 111 ddd
444 yyyy 777
oldboy 234 uuuu ppp
888
[root@linuxsd ~]# awk '{print $(NF-1)}' 4.txt 
aaaa
444
111
yyyy
uuuu
888

3.4 awk指定分隔符

awk指定分隔符: 默认只按照空格和tab键分隔
[root@linuxsd ~]# awk '{print $1}' oldboy.txt 
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/shehe/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/binnn/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

awk -F 指定分隔符(指定任意的字符为分隔符)
[root@linuxsd ~]# awk -F: '{print $1}' oldboy.txt 
root
daemon
adm
lp
sync
shutdown
halt
mail
operator

第二种写法:
[root@linuxsd ~]# awk -F ":" '{print $1}' oldboy.txt
root
daemon
adm
lp
sync
shutdown
halt
mail
operator

[root@linuxsd ~]# awk -F: '{print $NF}' oldboy.txt
/bin/bash
/sbin/nologin
/shehe/nologin
/sbin/nologin
/binnn/sync
/sbin/shutdown
/sbin/halt
/sbin/nologin
/sbin/nologin

[root@linuxsd ~]# cat a.txt 
root:x:0:0:root:/root:/bin/bash
[root@linuxsd ~]# awk -F/ '{print $1}' a.txt 
root:x:0:0:root:
[root@linuxsd ~]# awk -F/ '{print $2}' a.txt 
root:
[root@linuxsd ~]# awk -F/ '{print $3}' a.txt 
bin
[root@linuxsd ~]# awk -F/ '{print $4}' a.txt 
bash

3.5 awk使用正则方式指定分隔符

将:/看做一个整体进行分隔
[root@linuxsd ~]# cat a.txt 
root:x:0:0:root:/root:/bin/bash
[root@linuxsd ~]# awk -F ":/" '{print $1}' a.txt 
root:x:0:0:root
[root@linuxsd ~]# awk -F ":/" '{print $2}' a.txt 
root
[root@linuxsd ~]# awk -F ":/" '{print $3}' a.txt 
bin/bash

[]表示任意单个字符
[root@linuxsd ~]# cat a.txt 
root:x:0:0:root:/root:/bin/bash
[root@linuxsd ~]# awk -F "[:/]" '{print $6}' a.txt 

[root@linuxsd ~]# awk -F "[:/]" '{print $10}' a.txt 
bash


连续出现的字符进行切割:
[root@linuxsd ~]# awk -F "[:/]+" '{print $8}' a.txt 
bash


正则:
[root@linuxsd ~]# echo +-:---oldboy-+:--test---::+mysql
+-:---oldboy-+:--test---::+mysql
[root@linuxsd ~]# echo +-:---oldboy-+:--test---::+mysql|awk -F "[+-:]" '{print $7}'
oldboy
[root@linuxsd ~]# echo +-:---oldboy-+:--test---::+mysql|awk -F "[+-:]" '{print $12}'
test
[root@linuxsd ~]# echo +-:---oldboy-+:--test---::+mysql|awk -F "[+-:]" '{print $NF}'
mysql

[root@linuxsd ~]# echo +-:---oldboy-+:--test---::+mysql|awk -F "[+-:]+" '{print $2}'
oldboy
[root@linuxsd ~]# echo +-:---oldboy-+:--test---::+mysql|awk -F "[+-:]+" '{print $3}'
test
[root@linuxsd ~]# echo +-:---oldboy-+:--test---::+mysql|awk -F "[+-:]+" '{print $4}'
mysql


以数字切割
[root@linuxsd ~]# cat a.txt 
root:x:0:0:root:92/root:4/bin/bash
[root@linuxsd ~]# awk -F "[0-9]" '{print $1}' a.txt 
root:x:
[root@linuxsd ~]# awk -F "[0-9]" '{print $5}' a.txt 
/root:
[root@linuxsd ~]# awk -F "[0-9]+" '{print $4}' a.txt 
/root:

[root@linuxsd ~]# awk -F "[0-9:/]+" '{print $5}' a.txt 
bin

3.6 awk模式加动作

语法:       awk '找谁{干啥}' file
               awk '模式{动作}' file
找谁: 按照指定行
NR==5
NR>5
NR<5
NR!=5
NR>5&&NR==10
NR>5||NR==1
模糊过滤
awk '/字符串/' file
awk '//,//' file


案例1.显示第5行的第1列
[root@linuxsd ~]# awk -F: 'NR==5{print $1}' oldboy.txt 
sync
[root@linuxsd ~]# awk -F: 'NR==5{print $NF,$1}' oldboy.txt 
/binnn/sync sync

案例2.显示第2行到第5行的最后一列
[root@linuxsd ~]# awk -F: 'NR>=2&&NR<=5' oldboy.txt 
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/shehe/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/binnn/sync
[root@linuxsd ~]# awk -F: 'NR>=2&&NR<=5{print $1}' oldboy.txt 
daemon
adm
lp
sync
[root@linuxsd ~]# awk -F: 'NR>=2&&NR<=5{print $NF}' oldboy.txt 
/sbin/nologin
/shehe/nologin
/sbin/nologin
/binnn/sync


模糊过滤:
[root@linuxsd ~]# awk -F: '/root/{print $1}' oldboy.txt 
root
operator

正则:
[root@linuxsd ~]# awk -F: '/^shut/{print $NF}' oldboy.txt 
/sbin/shutdown


扩展了解: 字符串比对和匹配
[root@linuxsd ~]# awk -F: '$1=="root"' oldboy.txt 
root:x:0:0:root:/root:/bin/bash
最后一列为/sbin/nolgoin的行
[root@linuxsd ~]# awk -F: '$NF=="/sbin/nologin"' oldboy.txt 
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

按列匹配正则:
[root@linuxsd ~]# awk -F "[:/]+" '$6=="var"' oldboy.txt 
adm:x:3:4:adm:/var/adm:/shehe/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[root@linuxsd ~]# awk -F "[:/]+" '$6=="^v"' oldboy.txt 
[root@linuxsd ~]# 
[root@linuxsd ~]# awk -F "[:/]+" '$6 ~ "^v"' oldboy.txt 
adm:x:3:4:adm:/var/adm:/shehe/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[root@linuxsd ~]# awk -F "[:/]+" '$6 ~ "r$"' oldboy.txt 
adm:x:3:4:adm:/var/adm:/shehe/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

awk运算:
awk格式化输出:

[root@linuxsd ~]# awk -F: 'BEGIN{print "用户"}{print $1}END{print "结束"}' oldboy.txt  
用户
root
daemon
adm
lp
sync
shutdown
halt
mail
operator
结束


[root@linuxsd ~]# echo oldboy{1..3}|xargs -n1|sed -r 's#(.*)#useradd \1#g'
useradd oldboy1
useradd oldboy2
useradd oldboy3


[root@linuxsd ~]# echo oldboy{1..3}|xargs -n1|awk '{print "useradd "$1}'
useradd oldboy1
useradd oldboy2
useradd oldboy3

请输入图片描述

发表评论

召唤看板娘