awk和sed命令

sed:Stream Editor文本流编辑,sed是一个“非交互式的”面向字符流的编辑器。能同时处理多个文件多行的内容,可以不对原文件改动,把整个文件输入到屏幕,可以把只匹配到模式的内容输入到屏幕上。还可以对原文件改动,但是不会再屏幕上返回结果。

sed命令的语法格式:

sed的命令格式: sed [option] ‘sed command‘filename

sed的脚本格式:sed [option] -f ‘sed script‘filename

sed命令的选项(option):

-n :只打印模式匹配的行

-e :直接在命令行模式上进行sed动作编辑,此为默认选项

-f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作

-r :支持扩展表达式

-i :直接修改文件内容

sed在文件中查询文本的方式:

1)使用行号,可以是一个简单数字,或是一个行号范围


x


x为行号


x,y


表示行号从x到y


/pattern


查询包含模式的行


/pattern /pattern


查询包含两个模式的行


pattern/,x


在给定行号上查询包含模式的行


x,/pattern/


通过行号和模式查询匹配的行


x,y!


查询不包含指定行号x和y的行

2)使用正则表达式、扩展正则表达式(必须结合-r选项)


^


锚点行首的符合条件的内容,用法格式"^pattern"


$


锚点行首的符合条件的内容,用法格式"pattern$"


^$


空白行


.


匹配任意单个字符


*


匹配紧挨在前面的字符任意次(0,1,多次)


.*


匹配任意长度的任意字符


\?


匹配紧挨在前面的字符0次或1次


\{m,n\}


匹配其前面的字符至少m次,至多n次


\{m,\}


匹配其前面的字符至少m次


\{m\}


精确匹配前面的m次\{0,n\}:0到n次


\<


锚点词首----相当于 \b,用法格式:\<pattern


\>


锚点词尾,用法格式:\>pattern


\<pattern\>


单词锚点

 
分组,用法格式:pattern,引用\1,\2


[]


匹配指定范围内的任意单个字符


[^]


匹配指定范围外的任意单个字符


[:digit:]


所有数字, 相当于0-9, [0-9]---> [[:digit:]]


[:lower:]


所有的小写字母


[:upper:]


所有的大写字母


[:alpha:]


所有的字母


[:alnum:]


相当于0-9a-zA-Z


[:space:]


空白字符


[:punct:]


所有标点符号

[java] view plain copy

  1. #######sed的匹配模式支持正则表达式#####################
  2. sed‘5 q‘/etc/passwd#打印前5行
  3. sed-n ‘/r*t/p‘/etc/passwd#打印匹配r有0个或者多个,后接一个t字符的行
  4. sed-n ‘/.r.*/p‘/etc/passwd#打印匹配有r的行并且r后面跟任意字符
  5. sed-n ‘/o*/p‘/etc/passwd#打印o字符重复任意次
  6. sed-n ‘/o\{1,\}/p‘/etc/passwd#打印o字重复出现一次以上
  7. sed-n ‘/o\{1,3\}/p‘/etc/passwd#打印o字重复出现一次到三次之间以上

sed的编辑命令(sed command):


p


打印匹配行(和-n选项一起合用)


=


显示文件行号


a\


在定位行号后附加新文本信息


i\


在定位行号后插入新文本信息


d


删除定位行


c\


用新文本替换定位文本


w filename


写文本到一个文件,类似输出重定向 >


r filename


从另一个文件中读文本,类似输入重定向 <


s


使用替换模式替换相应模式


q


第一个模式匹配完成后退出或立即退出


l


显示与八进制ACSII代码等价的控制符


{}


在定位行执行的命令组,用分号隔开


n


从另一个文件中读文本下一行,并从下一条命令而不是第一条命令开始对其的处理


N


在数据流中添加下一行以创建用于处理的多行组


g


将模式2粘贴到/pattern n/


y


传送字符,替换单个字符

对文件的操作无非就是”增删改查“,怎样用sed命令实现对文件的”增删改查“,玩转sed是写自动化脚本必须的基础之一。

sed命令打印文件信息(查询):

[java] view plain copy

  1. ####用sed打印文件的信息的例子的命令######
  2. sed -n ‘/^#/!p‘  /etc/vsftpd/vsftpd.conf
  3. sed -n ‘/^#/!{/^$/!p}‘  /etc/vsftpd/vsftpd.conf
  4. sed -e ‘/^#/d‘ -e ‘/^$/d‘  /etc/vsftpd/vsftpd.conf
  5. sed -n ‘1,/adm/p‘ /etc/passwd
  6. sed -n ‘/adm/,6p‘ /etc/passwd
  7. sed -n ‘/adm/,4p‘ /etc/passwd
  8. sed -n ‘/adm/,2p‘ /etc/passwd
  9. ###以下图片是对这些sed命令例子的解释和显示结果

sed命令实现对文件内容的添加:(对源文件添加的话就用-i参数):

[java] view plain copy

  1. ####sed命令可以实现的添加######
  2. #1)匹配行的行首添加,添加在同行
  3. #2)匹配行的行中的某个字符后添加
  4. #3)匹配行的行尾添加字符
  5. #4)匹配行的行前面行添加
  6. #5)匹配行的行后面行添加
  7. #6)文件的行首添加一行
  8. [root@jie1 ~]# sed -i ‘1 i\sed command start‘ myfile
  9. #7)文件的行尾追加一行
  10. [root@jie1 ~]# sed -i ‘$a \sed command end‘ myfile

sed命令实现对文件内容的删除:(对源文件直接删除用-i参数):

sed的删除操作是针对文件的行,如果想删除行中的某个字符,那就用替换(别急,替换稍后就讲,而且替换是sed最常用的)

重点:sed命令实现对文件内容的替换(替换是在shell自动化脚本中用到最多的操作)

[java] view plain copy

  1. #================源文件里面的内容===============================
  2. [root@jie1 ~]# cat test
  3. anonymous_enable=YES
  4. write_enable=YES
  5. local_umask=022
  6. xferlog_enable=YES
  7. connect_from_port_20=YES
  8. root:x:0:0:root:/root:/bin/bash
  9. bin:x:1:1:bin:/bin:/sbin/nologin
  10. daemon:x:2:2:daemon:/sbin:/sbin/nologin
  11. adm:x:3:4:adm:/var/adm:/sbin/nologin
  12. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  13. DEVICE="eth0"
  14. BOOTPROTO="static"
  15. HWADDR="00:0C:29:90:79:78"
  16. ONBOOT="yes"
  17. IPADDR=172.16.22.1
  18. NETMASK=255.255.0.0
  19. #======================================================================
  20. [root@jie1 ~]# sed -i ‘/DEVICE/c\Ethernet‘ test
  21. #匹配DEVICE的行,替换成Ethernet这行
  22. [root@jie1 ~]# sed -i ‘s/static/dhcp/‘ test
  23. #把static替换成dhcp(/,@,#都是前面所说的地址定界符)
  24. [root@jie1 ~]# sed -i ‘/IPADDR/[email protected]\[email protected]@‘ test
  25. #匹配IPADDR的行,把22.1替换成10.12由于.号有特殊意义所有需要转义
  26. [root@jie1 ~]# sed -i ‘/connect/s#YES#NO#‘ test
  27. #匹配connect的行,把YES替换成NO
  28. [root@jie1 ~]# sed -i ‘s/bin/tom/2g‘ test
  29. #把所有匹配到bin的行中第二次及第二次之后出现bin替换成tom
  30. [root@jie1 ~]# sed -i ‘s/daemon/jerry/2p‘ test
  31. #把所有匹配到bin的行中第二次出现的daemon替换成jerry,并在生产与匹配行同样的行
  32. [root@jie1 ~]# sed -i ‘s/adm/boss/2‘ test
  33. #把所有匹配到adm的行中仅仅只是第二次出现的adm替换成boss
  34. [root@jie1 ~]# sed -i ‘/root/{s/bash/nologin/;s/0/1/g}‘ test
  35. #匹配root的行,把bash替换成nologin,且把0替换成1
  36. [root@jie1 ~]# sed -i ‘s/root/(&)/g‘ test
  37. #把root用括号括起来,&表示引用前面匹配的字符
  38. [root@jie1 ~]# sed -i ‘s/BOOTPROTO/#BOOTPROTO/‘ test
  39. #匹配BOOTPROTO替换成#BOOTPROTO,在配置文件中一般用于注释某行
  40. [root@jie1 ~]# sed -i ‘s/ONBOOT/#&/‘ test
  41. #匹配ONBOOT的行的前面添加#号,在配置文件中也表示注释某行
  42. [root@jie1 ~]# sed -i ‘/ONBOOT/s/#//‘ test
  43. #匹配ONBOOT的行,把#替换成空,即去掉#号,也一般用作去掉#注释
  44. #================执行以上sed命令之后文件显示的内容====================
  45. [root@jie1 ~]# cat test
  46. anonymous_enable=YES
  47. write_enable=YES
  48. local_umask=022
  49. xferlog_enable=YES
  50. connect_from_port_20=NO
  51. (root):x:1:1:(root):/(root):/bin/nologin
  52. bin:x:1:1:tom:/tom:/stom/nologin
  53. daemon:x:2:2:jerry:/sbin:/stom/nologin
  54. daemon:x:2:2:jerry:/sbin:/stom/nologin
  55. adm:x:3:4:boss:/var/adm:/sbin/nologin
  56. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  57. Ethernet
  58. #BOOTPROTO="dhcp"
  59. HWADDR="00:0C:29:90:79:78"
  60. ONBOOT="yes"
  61. IPADDR=172.16.10.12
  62. NETMASK=255.255.0.0

sed引用变量:(在自动化shell脚本 中也经常会使用到变量)

第一种当sed命令里面没有默认的变量时可以把单引号改成双引号;

第二种当sed命令里面有默认的变量时,那自己定义的变量需要加单引号,且sed里面的语句必须用单引

[java] view plain copy

  1. [root@jie1 ~]# cat >> myfile << EOF
  2. > hello world
  3. > i am jie
  4. > how are you
  5. > EOF   #先生成一个文件
  6. [root@jie1 ~]# cat myfile
  7. hello world
  8. i am jie
  9. how are you
  10. [root@jie1 ~]# name=li
  11. #定义一个变量,且给变量赋值
  12. [root@jie1 ~]# sed -i "s/jie/$name/" myfile
  13. #把匹配jie的字符替换成变量的值
  14. [root@jie1 ~]# cat myfile
  15. hello world
  16. i am li
  17. how are you
  18. [root@jie1 ~]# sed -i "$a $name" myfile
  19. #当sed命令也有默认变量时,在去引用自己定义的变量会出现语法错误
  20. sed: -e expression #1, char 3: extra characters after command
  21. [root@jie1 ~]# sed -i ‘$a ‘$name‘‘ myfile
  22. #在引用自定义的变量时,sed语句必须用单引引住,然后把自定义的变量也用单引号引住
  23. [root@jie1 ~]# cat myfile
  24. hello world
  25. i am li
  26. how are you
  27. li
  28. [root@jie1 ~]#

sed的其它高级使用:

1)把正在用sed操作的文件的内容写到例外一个文件中

[java] view plain copy

  1. [root@jie1 ~]# cat test   #sed操作的文件中的内容
  2. Ethernet
  3. #BOOTPROTO="dhcp"
  4. HWADDR="00:0C:29:90:79:78"
  5. ONBOOT="yes"
  6. IPADDR=172.16.10.12
  7. NETMASK=255.255.0.0
  8. [root@jie1 ~]# sed -i ‘s/IPADDR/ip/w ip.txt‘ test
  9. #把sed操作的文件内容保存到另外一个文件中,w表示保存,ip.txt文件名
  10. [root@jie1 ~]# cat ip.txt  #查看新文件的内容
  11. ip=172.16.10.12
  12. [root@jie1 ~]#

2)读取一个文件到正在用sed操作的文件中

[java] view plain copy

  1. [root@jie1 ~]# cat myfile   #文件内容
  2. hello world
  3. i am li
  4. how are you
  5. li
  6. [root@jie1 ~]# cat test  #将用sed操作的文件的内容
  7. Ethernet
  8. #BOOTPROTO="dhcp"
  9. HWADDR="00:0C:29:90:79:78"
  10. ONBOOT="yes"
  11. IPADDR=172.16.10.12
  12. NETMASK=255.255.0.0
  13. [root@jie1 ~]# sed  -i ‘/Ethernet/r myfile‘ test
  14. #在匹配Ethernet的行,读进来另一个文件的内容,读进来的文件的内容会插入到匹配Ethernet的行后
  15. [root@jie1 ~]# cat test  #再次查看用sed命令操作的行
  16. Ethernet
  17. hello world
  18. i am li
  19. how are you
  20. li
  21. #BOOTPROTO="dhcp"
  22. HWADDR="00:0C:29:90:79:78"
  23. ONBOOT="yes"
  24. IPADDR=172.16.10.12
  25. NETMASK=255.255.0.0
  26. [root@jie1 ~]#

sed的经典例子:

[java] view plain copy

  1. ##1)、处理以下文件内容,将域名取出并进行计数排序,如处理:
  2. http://www.baidu.com/index.<a target="_blank" href="http://www.2cto.com/kf/qianduan/css/" class="keylink" style="border:none; padding:0px; margin:0px; color:rgb(51,51,51); text-decoration:none; font-size:14px">html</a>
  3. http://www.baidu.com/1.html
  4. http://post.baidu.com/index.html
  5. http://mp3.baidu.com/index.html
  6. http://www.baidu.com/3.html
  7. http://post.baidu.com/2.html
  8. 得到如下结果:
  9. 域名的出现的次数 域名
  10. 3 www.baidu.com
  11. 2 post.baidu.com
  12. 1 mp3.baidu.com
  13. [root@localhost shell]# cat file | sed -e ‘ s/http:\/\///‘ -e ‘ s/\/.*//‘ | sort | uniq -c | sort -rn
  14. 3 www.baidu.com
  15. 2 post.baidu.com
  16. 1 mp3.baidu.com
  17. [root@codfei4 shell]# awk -F/ ‘{print $3}‘ file |sort -r|uniq -c|awk ‘{print $1"\t",$2}‘
  18. 3 www.baidu.com
  19. 2 post.baidu.com
  20. 1 mp3.baidu.com
  21. ##2)、用grep结合sed取出网卡的ip地址
  22. [root@jie1 ~]# ifconfig | grep -B1 "inet addr" |grep -v "\-\-" |sed -n -e ‘N;s/eth[0−9].*\n.*addr:[0−9]{1,3}\.[0−9]{1,3}\.[0−9]{1,3}\.[0−9]{1,3}.*/\1 \2/p‘

原文地址:https://www.cnblogs.com/ZCQ123456/p/11490982.html

时间: 2024-10-10 04:17:39

awk和sed命令的相关文章

grep、awk、sed命令详解2

grep.awk.sed命令详解 上一篇对grep.awk.sed命令的基本参数做了介绍,这一篇写一些例子. 1.分析access.log日志内,当天访问次数最多的10个页面,并且按降序排列. # cat access.log|awk -F ' ' '{print $7}'|sort|uniq -c|sort -nr|head -10 2.获取访问最高的10个IP地址. # cat access.log|awk -F ' ' '{print $1}'|sort|uniq -c|sort -nr|

linux之awk、sed命令

总结: 两个命令的正则表达式都用''单引号进行区分. 输出变量名用单引号,输出变量值用双引号,这个在bash脚本里一般是通用的. 在bash脚本里要使用变量值,都要加上双引号 awk用法: 参考网址:http://www.cnblogs.com/xudong-bupt/p/3721210.html 命令形式: awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file 对product_uuid一行以“=”进行分隔,显示第二个参数内容 a

sed命令用法

注意:Linux三大文本查找工具:grep.sed.awk. sed命令基本用法: Stream EDitor:行编辑器:实现逐行处理文本:而全屏编辑器是vim. 工作特性: 并不处理文本文件本身,而是处理文件内容时,是逐行的把文本加载至内存空间中,在内存中完成处理,然后再输出到屏幕上,对sed而言,内存空间叫模式空间,可对文本行进行模式匹配后再做处理,sed有许多编辑命令. sed命令默认不编辑原文件,仅对模式空间中的数据做处理,而后,处理结束后,将模式空间的内容显示至屏幕. sed命令格式

Linux字符串截取和处理命令 cut、printf、awk、sed、sort、wc

1. cut [选项] 文件名 -f  列号 #提取第几列(分隔符默认为\t) -d  分隔符 #指定分隔符 例如:cut -f 2 a.txt #截取文件a.txt内容的第二列(列号从1开始) cut -f 2,4 a.txt #截取文件a.txt内容的第二列和第四列 cut -d  ":"  -f 1,3 /etc/passwd #截取文件passwd文件的第1列和第三列,以:分割取其中的第一列和第三列 2. printf '输出类型 输出格式'  输出内容 输出类型: %ns 输

利用多核CPU来加速Linux命令 — awk、sed、bzip2、grep、wc

你是否曾经有过要计算一个非常大的数据(几百GB)的需求?或在里面搜索,或其它操作--一些无法并行的操作.数据专家们,我是在对你们说.你可能有一个4核或更多核的CPU,但我们合适的工具,例如 grep, bzip2, wc, awk, sed等等,都是单线程的,只能使用一个CPU内核.借用卡通人物Cartman的话,"如何我能使用这些内核"?要想让Linux命令使用所有的CPU内核,我们需要用到GNU Parallel命令,它让我们所有的CPU内核在单机内做神奇的map-reduce操作

grep,awk和sed的常用命令和语法

Grep的常用命令语法 1. 双引号引用和单引号引用在g r e p命令中输入字符串参数时,最好将其用双引号括起来.例如:“m y s t r i n g”.这样做有两个原因,一是以防被误解为 s h e l l命令,二是可以用来查找多个单词组成的字符串,例如:“jet plane”,如果不用双引号将其括起来,那么单词 p l a n e将被误认为是一个文件,查询结果将返回“文件不存在”的错误信息.在调用变量时,也应该使用双引号,诸如: g r e p“$ M Y VA R”文件名,如果不这样,

第四章 shell学习之sed命令和awk编程

sed命令 sed只是对缓冲区中原始文件的副本进行编辑,不改变源文件,所以要保存则要重定向到另一个文件 sed三种方式: 1.sed [选项] 'sed命令' 输入文件 2.sed [选项] -f sed脚本文件 输入文件 3../sed脚本文件 输入文件 其中3的sed脚本文件要以#! bin/sed -f等开头 选项: -n 不打印所有行到标准输出,默认先打印匹配的再打印所有 -e 关联多个sed命令 -f 调用sed脚本文件 定位文本: x x为指定行号 x,y 从x到y行 /patter

cut\grep\awk\sed命令详解

cut\grep\awk\sed命令详解 1.cut命令详解及实例 (1)作用:提取文件中指定的列 语法格式:cut  选项  文件名   (2)选项作用:      -d 分隔符     按照指定的分割符进行分割      -f 列号       指定提取第几列      -c 字符范围  不依赖分割符来分割,而是通过字符范围进行字段提取      -b 字节数     以字节为单位进行分割.    (3)cut实际应用案例. 例1:cut的-d和-f选项的使用,列出/etc/passwd里面

详解Shell脚本:sed命令工具 ,awk命令工具

-----------------------------概述----------------------------------- Linux文本处理工具(以下都是命令和工具,而且只是作为展示,不能作为修改动作) grep(过滤,但是不支持正则表达式)egrep(支持正则表达式)sed (行过滤)awk(列过滤) - 正则表达式概念 正则表达式:使用单个字符串来描述.匹配一系列符合某个句法规则的字符串 由普通字符与特殊字符组成,一般用在脚本编程.文本编辑器中,如php.python.she等,