热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

第9章正则扩展

扩展一第14章正则表达式http:www.apelearn.comstudy_v2chapter14.htmlgrep语法:grep[-cinvABC]‘word‘filename
//扩展一//
第14章 正则表达式 http://www.apelearn.com/study_v2/chapter14.html
grep
语法: grep [-cinvABC] ‘word‘ filename
-c :打印符合要求的行数
-i :忽略大小写
-n :在输出符合要求的行的同时连同行号一起输出
-v :打印不符合要求的行
-A :后跟一个数字(有无空格都可以),例如 –A2则表示打印符合要求的行以及下面两行
-B :后跟一个数字,例如 –B2 则表示打印符合要求的行以及上面两行
-C :后跟一个数字,例如 –C2 则表示打印符合要求的行以及上下各两行

1.过滤出带有某个关键词的行并输出行号
grep -n ‘root‘ /etc/passwd
2.过滤不带有某个关键词的行,并输出行号
grep -nv ‘nologin‘ /etc/passwd
3.过滤出所有包含数字的行
grep ‘[0-9]‘ /etc/inittab
4.过滤出所有不包含数字的行
grep -v ‘[0-9]‘ /etc/inittab
5.把所有以 ‘#’ 开头的行去除
grep -v ‘^#‘ /etc/inittab
6.去除所有空行和以 ‘#’ 开头的行
grep -v ‘^#‘ /etc/crontab |grep -v ‘^$‘
在正则表达式中, “^” 表示行的开始, “$” 表示行的结尾,那么空行则可以用 “^$” 表示
7.过滤任意一个字符与重复字符
grep ‘r..o‘ /etc/passwd
8.指定要过滤字符出现的次数
grep ‘o{2}‘ /etc/passwd
egrep
1.筛选一个或一个以上前面的字符
egrep ‘o+‘ test.txt
2.筛选零个或一个前面的字符
egrep ‘o?‘ test.txt
3.筛选字符串1或者字符串2
egrep ‘aaa|111|ooo‘ test.txt
4.egrep中( )的应用
egrep ‘r(oo|at)o‘ test.txt
用( )表示一个整体,例如(oo)+就表示1个 ‘oo’ 或者多个 ‘oo’
egrep ‘(oo)+‘ test.txt
sed工具的使用
grep实现的只是查找功能,而它却不能实现把查找的内容替换掉。sed工具以及下面要讲的awk工具就能实现把替换的文本输出到屏幕上的功能了,而且还有其他更丰富的功能。sed和awk都是流式编辑器,是针对文档的行来操作的。
1.打印某行
sed -n ‘n‘p filename 单引号内的n是一个数字,表示第几行:
sed -n ‘1,$‘p filename 把所有行都打印出来可以使用
2.打印包含某个字符串的行
sed -n ‘/root/‘p test.txt
3.-e可以实现多个行为
sed -e ‘1‘p -e ‘/111/‘p -n test.txt
4.删除某行或者多行
sed ‘1,3‘d test.txt
‘d’ 这个字符就是删除的动作了,不仅可以删除指定的单行以及多行,而且还可以删除匹配某个字符的行,另外还可以删除从某一行一直到文档末行。
5.替换字符或字符串
sed ‘1,2s/ot/to/g‘ test.txt
sed ‘s#ot#to#g‘ test.txt
‘s’ 就是替换的命令, ‘g’ 为本行中全局替换,如果不加 ‘g’ 只换该行中出现的第一个。除了可以使用 ‘/’ 作为分隔符外,还可以使用其他特殊字符例如 ‘#’ 或者 ‘@’ 都没有问题。
6.调换两个字符串的位置
sed ‘s/(rot)(.)(bash)/\3\2\1/‘ test.txt
用 () 把所想要替换的字符括起来成为一个整体,因为括号在sed中属于特殊符号,所以需要在前面加脱意字符 ‘’, 替换时则写成 ‘1’, ‘‘2’, ‘‘3’ 的形式。除了调换两个字符串的位置外,还常常用到在某一行前或者后增加指定内容。
sed ‘s/^.
$/123&/‘ test.txt
7.直接修改文件的内容
sed -i ‘s/ot/to/g‘ test.txt
这个命令可以直接把文件修改.

练习:把/etc/passwd 复制到/root/test.txt,用sed打印所有行
打印test.txt的3到10行
打印test.txt 中包含 ‘root’ 的行
删除test.txt 的15行以及以后所有行
删除test.txt中包含 ‘bash’ 的行
替换test.txt 中 ‘root’ 为 ‘toor’
替换test.txt中 ‘/sbin/nologin’ 为 ‘/bin/login’
删除test.txt中5到10行中所有的数字
删除test.txt 中所有特殊字符(除了数字以及大小写字母)
把test.txt中第一个单词和最后一个单词调换位置
把test.txt中出现的第一个数字和最后一个单词替换位置
把test.txt 中第一个数字移动到行末尾
在test.txt 20行到末行最前面加 ‘aaa:’
阿铭希望你能尽量多想一想,答案只是用来作为参考的。
sed习题答案

  1. /bin/cp /etc/passwd /root/test.txt ; sed -n ‘1,$‘p test.txt
  2. sed -n ‘3,10‘p test.txt
  3. sed -n ‘/root/‘p test.txt
  4. sed ‘15,$‘d test.txt
  5. sed ‘/bash/‘d test.txt
  6. sed ‘s/root/toor/g‘ test.txt
  7. sed ‘s#sbin/nologin#bin/login#g‘ test.txt
  8. sed ‘5,10s/[0-9]//g‘ test.txt
  9. sed ‘s/[^0-9a-zA-Z]//g‘ test.txt
  10. sed ‘s/(^[a-zA-Z][a-zA-Z])([^a-zA-Z].)([^a-zA-Z])([a-zA-Z][a-zA-Z]*$)/\4\2\3\1/‘ test.txt
  11. sed ‘s#([^0-9][^0-9])([0-9][0-9])([^0-9].)([^a-zA-Z])([a-zA-Z][a-zA-Z]$)#\1\5\3\4\2#‘ test.txt
  12. sed ‘s#([^0-9][^0-9])([0-9][0-9])([^0-9].*$)#\1\3\2#‘ test.txt
  13. sed ‘20,$s/^.*$/aaa:&/‘ test.txt
    awk工具的使用
    awk比sed更加强大,它能做到sed能做到的,同样也能做到sed不能做到的。awk工具其实是很复杂的。
    1.截取文档中的某个段
    head -n2 /etc/passwd |awk -F ‘:‘ ‘{print $1}‘
    head -n2 test.txt |awk -F‘:‘ ‘{print $0}‘
    -F 选项的作用是指定分隔符,如果不加-F指定,则以空格或者tab为分隔符。 Print为打印的动作,用来打印出某个字段。$1为第一个字段,$2为第二个字段,依次类推,有一个特殊的那就是$0,它表示整行。
    注意awk的格式,-F后紧跟单引号,然后里面为分隔符,print的动作要用 { } 括起来,否则会报错。print还可以打印自定义的内容,但是自定义的内容要用双引号括起来。
    head -n2 test.txt |awk -F‘:‘ ‘{print $1"#"$2"#"$3"#"$4}‘
    2.匹配字符或字符串
    awk ‘/oo/‘ test.txt
    awk -F ‘:‘ ‘$1 ~/oo/‘ test.txt
    可以让某个段去匹配,这里的’~’就是匹配的意思
    awk -F ‘:‘ ‘/root/ {print $1,$3} /test/ {print $1,$3}‘ /etc/passwd
    还可以多次匹配,如上例中匹配完root,再匹配test,它还可以只打印所匹配的段。
    3.条件操作符
    awk -F ‘:‘ ‘$3=="0"‘ /etc/passwd
    awk中是可以用逻辑符号判断的,比如 ‘==’ 就是等于,也可以理解为 ‘精确匹配’ 另外也有 >, ‘>=, ‘<, ‘<=, ‘!= 等等,值得注意的是,在和数字比较时,若把比较的数字用双引号引起来后,那么awk不会认为是数字,而认为是字符,不加双引号则认为是数字。
    awk把所有的数字当作字符来对待.
    awk -F ‘:‘ ‘$3<$4‘ /etc/passwd
    != 为不匹配,除了针对某一个段的字符进行逻辑比较外,还可以两个段之间进行逻辑比较。
    awk -F ‘:‘ ‘$3>"5" && $3<"7"‘ /etc/passwd
    awk -F ‘:‘ ‘$3>"5" || $7=="/bin/bash"‘ /etc/passwd
    另外还可以使用 && 和 || 表示 “并且” 和 “或者” 的意思。
    4.awk的内置变量
    awk常用的变量有:
    NF :用分隔符分隔后一共有多少段
    NR :行数
    head -n3 /etc/passwd | awk -F ‘:‘ ‘{print NF}‘
    head -n3 /etc/passwd | awk -F ‘:‘ ‘{print $NF}‘
    NF 是多少段,而$NF是最后一段的值, 而NR则是行号。
    5.awk中的数学运算
    awk可以把段值更改
    head -n 3 /etc/passwd |awk -F ‘:‘ ‘$1="root"‘;
    当然还可以计算某个段的总和
    awk -F ‘:‘ ‘{(tot=tot+$3)}; END {print tot}‘ /etc/passwd

练习:
用awk 打印整个test.txt (以下操作都是用awk工具实现,针对test.txt)
查找所有包含 ‘bash’ 的行
用 ‘:’ 作为分隔符,查找第三段等于0的行
用 ‘:’ 作为分隔符,查找第一段为 ‘root’ 的行,并把该段的 ‘root’ 换成 ‘toor’ (可以连同sed一起使用)
用 ‘:’ 作为分隔符,打印最后一段
打印行数大于20的所有行
用 ‘:’ 作为分隔符,打印所有第三段小于第四段的行
用 ‘:’ 作为分隔符,打印第一段以及最后一段,并且中间用 ‘@’ 连接 (例如,第一行应该是这样的形式 ‘root@/bin/bash‘ )
用 ‘:’ 作为分隔符,把整个文档的第四段相加,求和
awk习题答案

  1. awk ‘{print $0}‘ test.txt
  2. awk ‘/bash/‘ test.txt
  3. awk -F‘:‘ ‘$3=="0"‘ test.txt
  4. awk -F‘:‘ ‘$1=="root"‘ test.txt |sed ‘s/root/toor/‘
  5. awk -F‘:‘ ‘{print $NF}‘ test.txt
  6. awk -F‘:‘ ‘NR>20‘ test.txt
  7. awk -F‘:‘ ‘$3<$4‘ test.txt
  8. awk -F‘:‘ ‘{print $1"@"$NF}‘ test.txt
  9. awk -F‘:‘ ‘{(sum+=$4)}; END {print sum}‘ test.txt

//扩展二//
(1)打印某行到某行之间的内容http://ask.apelearn.com/question/559
sed -n ‘/[abcfd]/,/[rty]/p‘ test 截取[abcfd]到[rty]间的内容
(2)sed转换大小写 http://ask.apelearn.com/question/7758
sed中,使用\u表示大写,\l表示小写

  1. 把每个单词的第一个小写字母变大写:sed ‘s/\b[a-z]/\u&/g‘ filename
  2. 把所有小写变大写:sed ‘s/[a-z]/\u&/g‘ filename
  3. 大写变小写:sed ‘s/[A-Z]/\l&/g‘ filename
    (3)sed在某一行最后添加一个数字http://ask.apelearn.com/question/288
    (4)删除某行到最后一行 http://ask.apelearn.com/question/213
    sed ‘/c/{p;:a;N;$!ba;d}‘ test
    定义一个标签a,匹配c,然后N把下一行加到模式空间里,匹配最后一行时,才退出标签循环,然后命令d,把这个模式空间里的内容全部清除。
    if 匹配"c"
    :a
    追加下一行
    if 不匹配"$"
    goto a
    最后退出循环,d命令删除。
    (5)打印1到100行含某个字符串的行 http://ask.apelearn.com/question/1048
    sed指定行范围匹配 sed -n ‘1,100{/abc/p}‘ 1.txt
    //扩展三//
    awk 用法(使用入门) http://www.cnblogs.com/emanlee/p/3327576.html
    //扩展四//
    awk 中使用外部shell变量http://ask.apelearn.com/question/199

awk 合并一个文件 http://ask.apelearn.com/question/493
awk ‘NR==FNR{a[$1]=$2}NR>FNR{print $0,a[$1]}‘ 1.txt 2.txt
解释:把两个文件中,第一列相同的行合并到同一行中。
NR表示读取的行数, FNR表示读取的当前行数,大家可以运行这个命令 awk ‘{print NR,FNR}‘ 1.txt 2.txt,比较NR和FNR,所以其实NR==FNR 就表示读取1.txt的时候。 同理NR>FNR表示读取2.txt的时候
数组a其实就相当于一个map。
把一个文件多行连接成一行 http://ask.apelearn.com/question/266
a=cat file;echo $a
awk ‘{printf("%s ",$0)}‘ file // %s 后记得要有一空格,否则出来就是完全连在一起的,中间连空格都没有
cat file |xargs
awk中gsub函数的使用 http://ask.apelearn.com/question/200
awk ‘gsub(/www/,"abc")‘ /etc/passwd // passwd文件中把所有www替换为abc
awk -F ‘:‘ ‘gsub(/www/,"abc",$1) {print $0}‘ /etc/passwd // 替换$1中的www为abc
awk 截取指定多个域为一行 http://ask.apelearn.com/question/224
用awk指定分隔符把文本分为若干段。如何把相同段的内容弄到一行?
以/etc/passwd为例,该文件以":"作为分隔符,分为了7段。
for i in seq 1 7
do
awk -F ‘:‘ -v a=$i ‘{printf $a " "}‘ /etc/passwd
echo
done
过滤两个或多个关键词 http://ask.apelearn.com/question/198
grep -E ‘123|abc‘ filename // 找出文件(filename)中包含123或者包含abc的行
egrep ‘123|abc‘ filename //用egrep同样可以实现
awk ‘/123|abc/‘ filename // awk 的实现方式
用awk生成以下结构文件 http://ask.apelearn.com/question/5494
awk用print打印单引号 http://ask.apelearn.com/question/1738
比较绕,不用死记硬背,以后用的时候,稍微多试几次就出来了。
awk ‘BEGIN{print "a‘"‘"‘s"}‘ //不用脱义,就多写几个单引号、双引号
awk ‘BEGIN{print "a‘\‘‘s"}‘ //用脱义,脱义的是单引号
awk ‘BEGIN{print "a\"s"}‘ //用脱义,脱义的是双引号
把两个文件中相同的行合并成一行 http://ask.apelearn.com/question/945
paste filename1 filename2
如果,你想在两个文件连接处用一个指定的字符连接,还可以用-d来指定
paste -d ‘+‘ a.txt b.txt

第9章 正则 扩展


推荐阅读
  • 一个登陆界面
    预览截图html部分123456789101112用户登入1314邮箱名称邮箱为空15密码密码为空16登 ... [详细]
  • 深入解析动态代理模式:23种设计模式之三
    在设计模式中,动态代理模式是应用最为广泛的一种代理模式。它允许我们在运行时动态创建代理对象,并在调用方法时进行增强处理。本文将详细介绍动态代理的实现机制及其应用场景。 ... [详细]
  • 嵌入式开发环境搭建与文件传输指南
    本文详细介绍了如何为嵌入式应用开发搭建必要的软硬件环境,并提供了通过串口和网线两种方式将文件传输到开发板的具体步骤。适合Linux开发初学者参考。 ... [详细]
  • 解决TensorFlow CPU版本安装中的依赖问题
    本文记录了在安装CPU版本的TensorFlow过程中遇到的依赖问题及解决方案,特别是numpy版本不匹配和动态链接库(DLL)错误。通过详细的步骤说明和专业建议,帮助读者顺利安装并使用TensorFlow。 ... [详细]
  • 探索新一代API文档工具,告别Swagger的繁琐
    对于后端开发者而言,编写和维护API文档既繁琐又不可或缺。本文将介绍一款全新的API文档工具,帮助团队更高效地协作,简化API文档生成流程。 ... [详细]
  • 深入理解ExtJS:从入门到精通
    本文详细介绍了ExtJS的功能及其在大型企业前端开发中的应用。通过实例和详细的文件结构解析,帮助初学者快速掌握ExtJS的核心概念,并提供实用技巧和最佳实践。 ... [详细]
  • 通常情况下,修改my.cnf配置文件后需要重启MySQL服务才能使新参数生效。然而,通过特定命令可以在不重启服务的情况下实现配置的即时更新。本文将详细介绍如何在线调整MySQL配置,并验证其有效性。 ... [详细]
  • Python自动化测试入门:Selenium环境搭建
    本文详细介绍如何在Python环境中安装和配置Selenium,包括开发工具PyCharm的安装、Python环境的设置以及Selenium包的安装方法。此外,还提供了编写和运行第一个自动化测试脚本的步骤。 ... [详细]
  • CentOS 系统管理基础
    本文介绍了如何在 CentOS 中查询系统版本、内核版本、位数以及磁盘分区的相关知识。通过这些命令,用户可以快速了解系统的配置和磁盘结构。 ... [详细]
  • 本文探讨了C++编程中理解代码执行期间复杂度的挑战,特别是编译器在程序运行时生成额外指令以确保对象构造、内存管理、类型转换及临时对象创建的安全性。 ... [详细]
  • Vue 开发与调试工具指南
    本文介绍了如何使用 Vue 调试工具,包括克隆仓库、安装依赖包、构建项目以及在 Chrome 浏览器中加载扩展的详细步骤。 ... [详细]
  • 如何清除Chrome浏览器地址栏的特定历史记录
    在使用Chrome浏览器时,你可能会发现地址栏保存了大量浏览记录。有时你可能希望删除某些特定的历史记录而不影响其他数据。本文将详细介绍如何单独删除地址栏中的特定记录以及批量清除所有历史记录的方法。 ... [详细]
  • 精致小屏灰色风格苹果CMS v10模板,支持DIY主题管理系统
    探索一款专为影视站设计的苹果CMS v10模板,具备强大的主题管理系统和500多个设置项,无需二次开发即可轻松配置。下载地址:https://www.mytheme.cn/maccms/244.html,演示地址:http://demo.mytheme.cn/index.php?id=244。 ... [详细]
  • 在安装 SQL Server 时,选择混合验证模式可以提供更高的灵活性和管理便利性。如果您已经安装了 SQL Server 并使用单一的 Windows 身份验证模式,可以通过以下步骤将其更改为混合验证模式。 ... [详细]
  • 本文详细介绍了一种高效的算法——线性筛法,用于快速筛选出一定范围内的所有素数。通过该方法,可以显著提高求解素数问题的效率。 ... [详细]
author-avatar
归向大海_651
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有