SED+AWK

SED
查找
sed -n '3p' /etc/yum.repos.d/test.repo.bak  查看文件第三行内容
sed -n '3,5p' /etc/yum.repos.d/test.repo.bak    查看文件第3-5行内容
sed -n '2p;5p' /etc/yum.repos.d/test.repo.bak    查看文件第2,5行内容
sed -n '1~2p' /etc/yum.repos.d/test.repo    查看文件隔一行的内容   1   3    5   7    9。。。。。。

插入字符
sed -i '3i zpq ' test.repo.new   第三行之前插入   字符行  zpq
sed -i '3a zpq ' test.repo.new  第三行之后插入   字符行  zpq

删除
sed -ri '3d' test.repo.new    删除第三行的内容
sed -ri.$(date +%F) '/base|enabled/d' test.repo.new    
删除包含base,enabled的行       -r   -i要放在最后     /d删除
.$(date +%F)      备份文件名称后缀
sed -ri '/^$/d' test.repo.new  删除空行


不加i则不执行,sed   -i.BAK    .BAK为备份参数,可谓其他值

替换
[root@localhost ~]# sed -i 's#text#test#g' test.repo
将text字符替换成test
整行替换
sed -i '1c [baseOS]'  test.repo   将第一行整行替换成[baseOS]
sed -i '4s#1#0#g' test.repo  将第4行中的1替换成0 
不加g只替换每行识别的第一个字符

touch  zpq{1..9}.txt
ls | xargs -n1 | sed -r 's#(.*)txt#mv \1txt \1md #g' |bash
替换文件后缀名txt转md,原理:现将文件名称输出,查找后缀为TXT的文件,替换成bash命令mv并执行
echo zpq | sed -r 's#(.*)#<\1>#g'

将zpq字符添加<>输出


注意:-n   和  -i 不要一起使用,每次修改建议备份
-r 扩展正则表达式
!p  !d  取反

for ((i=1;i<=11;i++));do echo {1..4} >> zpq2.txt; done
sed '/^$/d' zpq2.txt|sed  's# ##g' |sed '=' | xargs -n2
查看行数,先去除空行,将空格替换并输出行号   2列一组(包含序号)


AWK
ls -l `whick awk`  显示awk文件内容
命令结果引用:
echo  laoma > 1.txt
touch  `cat 1.txt`

[root@localhost zpq]# ll
total 4
-rw-r--r-- 1 root root 6 Nov 29 17:51 1.txt
-rw-r--r-- 1 root root 0 Nov 29 17:51 laoma


示例:
cp /etc/passwd . 复制passwd文件
vim passwd
:%s/:/ /g    将:替换成看空格符号
:wq!

cp passwd passwd.bak
column -t passwd.bak > passwd  纵向排列文件内容,并追加到passwd内容中
awk '/mail/ {print $3}' passwd   显示mail用户的UID
awk '/x/ {print $5}' passwd   输出passwd中第五项的内容

[root@localhost ~]# awk '/root/ {print }' passwd 显示整行的内容
[root@localhost ~]# awk '/root/ {print $1,$3,$5,$7}' passwd   使用,进行分隔多个参数
root 0 root /bin/bash
[root@localhost ~]# awk '/root/ {print $1,$3" && "$5,$7}' passwd    也可使用""进行分隔
root 0 && root /bin/bash
[root@localhost ~]# awk 'NR==2 {print $1,$3" && "$5,$7}' passwd    查看第二行相关列的参数
bin 1 && bin /sbin/nologin

[root@localhost ~]# awk '/spool/ {print $1,$3" && "$6,$7}' passwd    显示包含spool的参数
lp 4 && /var/spool/lpd /sbin/nologin
mail 8 && /var/spool/mail /sbin/nologin
awk -F "[ /]+" '/sbin/ {print $1,$5,$6}' passwd   | column -t  指定空格和/符号作为分隔符,查找匹配的行,输出相关列参数
bin       bin       bin
daemon    daemon    sbin
adm       adm       var
lp        lp        var
sync      sync      sbin
shutdown  shutdown  sbin
halt      halt      sbin
mail      mail      var


[root@localhost ~]# awk '{print $(NF-1)}' passwd    查看文件倒数第二列的信息,注意先进行系列运算,在进行查找$(NF-1)
/root
/bin
/sbin
/var/adm
/var/spool/lpd
/sbin
/sbin
/sbin
/var/spool/mail

查找以0开头进行输出具体列。
[root@localhost ~]# awk '$4~/^0/ {print $1,$3,$5,$7}' passwd  | column -t
root 0 root /bin/bash
sync 5 sync /bin/sync
shutdown 6 shutdown /sbin/shutdown
halt 7 halt /sbin/halt

$4~/^0/    ~表示包含和匹配
取反表示不包含41的行、列的参数
[root@localhost ~]# awk '$4~!/^0/ {print $1,$3,$5,$7}' passwd  | column -t
bin 1 bin /sbin/nologin
mail 8 mail /sbin/nologin
!表示取反

查找以n和h结尾的行的具体列的参数
(1)
[root@localhost ~]# awk '$7~/(n|h)$/ {print $1,$3,$5,$7}' passwd  | column -t
root 0 root /bin/bash
bin 1 bin /sbin/nologin
daemon 2 daemon /sbin/nologin
adm 3 adm /sbin/nologin
lp 4 lp /sbin/nologin
shutdown 6 shutdown /sbin/shutdown
mail 8 mail /sbin/nologin
(2)
[root@localhost ~]# awk '$7~/[nh]$/ {print $1,$3,$5,$7}' passwd | column -t    
root      0  root      /bin/bash
bin       1  bin       /sbin/nologin
daemon    2  daemon    /sbin/nologin
adm       3  adm       /sbin/nologin
lp        4  lp        /sbin/nologin
shutdown  6  shutdown  /sbin/shutdown
mail      8  mail      /sbin/nologin


将passwd中的sbin换成bin并输出
[root@localhost ~]# awk '{gsub (/sbin/,"bin",$6);print $6}' passwd
/root
/bin
/bin
/var/adm
/var/spool/lpd
/bin
/bin
/bin
/var/spool/mail

显示第二行之后的行
[root@localhost ~]# awk 'NR>2 {print}' passwd
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


范围模式
,显示2-5行的内容
[root@localhost ~]# awk 'NR==2,NR==5 {print}' passwd 
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
;显示第2行和第5行的内容
[root@localhost ~]# awk 'NR==2;NR==5 {print}' passwd 
bin                  x  1      1      bin                        /bin              /sbin/nologin
lp                   x  4      7      lp                         /var/spool/lpd    /sbin/nologin

[root@localhost ~]# awk 'gsub(/root/,"bin",$0)' passwd      $0表示所有列
bin                 x  0      0      bin                       /bin             /bin/bash

[root@localhost ~]# awk 'gsub(/(sbin|bin)/,"ABCD",$0)' passwd      将多个字符转换成ABCD
root                 x  0      0      root                       /root             /ABCD/bash
ABCD                  x  1      1      ABCD                        /ABCD              /ABCD/nologin
daemon               x  2      2      daemon                     /ABCD             /ABCD/nologin
adm                  x  3      4      adm                        /var/adm          /ABCD/nologin
lp                   x  4      7      lp                         /var/spool/lpd    /ABCD/nologin
sync                 x  5      0      sync                       /ABCD             /ABCD/sync
shutdown             x  6      0      shutdown                   /ABCD             /ABCD/shutdown
halt                 x  7      0      halt                       /ABCD             /ABCD/halt
mail                 x  8      12     mail                       /var/spool/mail   /ABCD/nologin

将/etc/passwd中的:更改为空格符号 并输出    \:进行转义
[root@localhost ~]# awk '{gsub(/\:/," ",$1);print $1}' /etc/passwd

NR==行信息 (第几行)
$NF== number filed (字段)       ---列信息 (默认最后一列) 


在没有使用-F指定分隔符信息时,默认awk用空格进行分割列,并且多个空格信息默认看成一个整体


特殊模式:
BEGIN;在文件处理之前,做出相应操作
END;在文件处理之后,做出相应操作
FS指定分隔符信息


[root@localhost ~]# awk 'BEGIN{print "oldboy"}NR==2;NR==5 {print} END{print"youngboy"}' passwd 
oldboy
bin                  x  1      1      bin                        /bin              /sbin/nologin
lp                   x  4      7      lp                         /var/spool/lpd    /sbin/nologin
youngboy
 
[root@localhost ~]# awk 'BEGIN {print 5+4}' 
9
[root@localhost ~]# awk 'BEGIN {print 5*4}' 
20


print $i没有值输出  print i 有值输出。print "i"  直接输出i字符,print 1234 直接输出字符串
[root@localhost ~]# awk '/^$/{i=i+1;print $i}' passwd

[root@localhost ~]# awk '/^$/{i=i+1;print i}' passwd
1
2
3
[root@localhost ~]# awk '/^$/{i=i+1;print "i"}' passwd    
i
i
i
[root@localhost ~]# awk '/^$/{i=i+1;print 1234}' passwd
1234
1234
1234

说明: 在AWK中调取变量信息,可以直接调取,不需要加$符号,加入$符号表示取列的信息

显示第三个/符号之前的列内容
[root@localhost ~]# awk -F "[/]+" '{print $3}' passwd     OR
[root@localhost ~]# awk 'BEGIN{FS="/"};{print $1}' passwd   效果一致
bin
sbin
sbin
adm          
spool
bin
sbin
sbin
spool

以下三者等价
[root@localhost ~]# awk 'BEGIN{FS="[/]+"};{print $1}' passwd
root                 x  0      0      root                       
bin                  x  1      1      bin                        
daemon               x  2      2      daemon                     
adm                  x  3      4      adm                        
lp                   x  4      7      lp                         
sync                 x  5      0      sync                       
shutdown             x  6      0      shutdown                   
halt                 x  7      0      halt                       
mail                 x  8      12     mail

[root@localhost ~]# awk -F "[ /]+" '{print $1}' passwd
root                 x  0      0      root                       
bin                  x  1      1      bin                        
daemon               x  2      2      daemon                     
adm                  x  3      4      adm                        
lp                   x  4      7      lp                         
sync                 x  5      0      sync                       
shutdown             x  6      0      shutdown                   
halt                 x  7      0      halt                       
mail                 x  8      12     mail

[root@localhost ~]# awk -vFS="/" '{print $1}' passwd
root                 x  0      0      root                       
bin                  x  1      1      bin                        
daemon               x  2      2      daemon                     
adm                  x  3      4      adm                        
lp                   x  4      7      lp                         
sync                 x  5      0      sync                       
shutdown             x  6      0      shutdown                   
halt                 x  7      0      halt                       
mail                 x  8      12     mail

赋予zpq变量,然后在打印出来
[root@localhost ~]# awk -vzpq=123 'BEGIN{print zpq}'
123

匹配任意内容和空行则加1,然后输出
[root@localhost ~]# awk '/.|^$/{i++} END{print i}' passwd
12

公式求和
[root@localhost ~]# seq 10 | awk '{i=i+$1} {print i}'
1
3
6
10
15
21
28
36
45
55
[root@localhost ~]# seq 0 5 100     0-100之间5的倍数


数组的组成部分:
zpq[01]=0101
名称[元素名称]=元素信息
zpq[02]=0202
zpq[03]=0303


定义数组,输出数组
[root@localhost ~]# awk 'BEGIN{zpq[01]="0101";print zpq[01]}'
0101
[root@localhost ~]# awk 'BEGIN{zpq[01]="123";zpq[02]="234";print zpq[01],zpq[02]}'
123 234
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值