鸟哥的linux私房菜——第12章 正则表达式与文件格式化处理

12.1什么是正则表达式

正则表达式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊符号的辅助,可以让用户轻易达到查找、删除、替换某特定字符串的处理程序。

vi、grep、awk、sed支持正则表达式,而cp,ls等命令只能使用bash自身的通配符

12.2基础正则表达式

grep高级参数:

grep [-A] [-B] [--color=auto]  ‘string‘   filename

-A:after的意思,除了列出该行外,后续的n行也列出来

-B:before的意思,除了列出该行外,前面的n行也列出来

--color=auto 可将正确的那个选取数据列出颜色

基础正则表达式练习:

例一:查找特定字符串

grep -n ‘the’ regular_express.txt

grep -vn ‘the‘ regular_express.txt   (-v反向选择)

例二:利用中括号[]来查找集合字符

grep -n ‘t[ae]st‘ regular_express.txt  (可匹配test或tast)

grep -n ‘[^g]oo‘ regular_express.txt  (oo前不能有g的字符)

grep -n ‘[^[:lower:]]oo‘ regular_express.txt   ([:lower:]代表a-z的意思)

例三:行首和行尾字符

grep -n ‘^test‘ regular_express.txt

(注:^在[]内表示“反向选择”,在[]外表示定位在行首)

grep -n ‘\.$‘ regular_express.txt   (找出行尾结束为小数点的那一行)

例四:任意一个字符.与重复字符*

grep -n ‘g..d’ regular_express.txt   (可匹配good,glad等字符)

grep -n ‘ooo*‘ regular_express.txt   (匹配至少两个o以上的字符)

grep -n ‘g.*g‘ regular_express.txt    (找出g开头与g结尾的字符串,.*表示o个或多个任意字符的意思)

例五:限定连续RE字符范围{}

grep -n ‘o\{2\}‘ regular_express.txt  (找出两个o的字符串)

grep -n ‘go\{2,5\}g’ regular_express.txt  (g后有两个到5个o,然后接一个g的字符串)

grep -n ‘go\{2,\}g’ regular_express.txt  (g后有两个及以上的o,然后接一个g的字符串)

基础正则表达式字符:

^word :待查找的字符串(word)在行首

word$ :待查找的字符串(word)在行尾

. :代表一定有一个任意字符的字符

\   : 转义字符,将特殊符号的特殊意义去除

*  : 重复0个或多个的前一个字符

[list] :从字符集合的RE字符里面找出想要选取的字符

[n1-n2]:从字符集合的RE字符里面找出想要选取的字符范围

[^list] :从字符集合的RE字符里面找出不要的字符串或范围

\{n,m\}:连续n到m个的前一个RE字符,\{n\}表示连续n个,\{n,\}表示连续n个及以上

sed工具:(详见sed & awk)

格式:sed [-nefr] [动作]

参数:

-n :使用安静模式,在一般的sed用法中,所有来自STDIN的数据一般都会被列到屏幕上,但如果加上-n参数后,则只有经过sed特殊处理的那一行才会被列出来

-e :直接在命令行模式上进行sed的动作编辑

-f  :直接将sed的动作写在一个文件内,-f filename 则可以执行filename内的sed动作

-r  :sed的动作支持的扩展型正则表达式的语法

-i  :直接修改读取的文件内容,而不是由屏幕输出

动作说明:[n1,[n2]] function

n1,n2不见得会存在,一般代表选择进行动作的行数

function参数:

a :新增,a的后面可以接字符串,而这些字符串会在目前的下一行出现

i  :插入,i 的后面可以接字符串,而这些字符串会在目前的上一行出现

c :替换,c的后面可以接字符串,这些字符串可以替换n1,n2之间的行

s :替换,可以直接进行替换工作,通常这个s可以搭配正则表达式

d :删除,因为是删除,所以d后面通常不接任何参数

p :打印,也就是将某个选择的数据打印出来,通常p会与参数sed -n一起运行

12.3扩展的正则表达式

+ :重复一个或多个的前一个RE字符

? :0个或一个的前一个RE字符

|  :用或的方式找出字符串

() :找出“组”的字符串  (如:egrep -n ‘g(la|oo)d’ regular_express.txt  表示找出glad或good字符串)

()+:多个重复组的判别   (如echo ‘AxyzxyzxyzxyzC‘ | egrep ‘A(xyz)+C‘  找出开头是A结尾是C,中间有一个以上的“xyz”字符串)

12.4文件的格式化与相关处理

格式化打印 printf:

格式:printf ‘打印格式‘ 实际内容

格式方面的几个特殊样式:

  \a 警告声音输出

  \b 退格键

  \f 清除屏幕

  \n 输出新的一行

  \r 亦即Enter按键

  \t 水平的tab按键

  \v 垂直的tab按键

  \xNN NN为两个数字,可以转换数字成字符

关于C语言内,常见的变量格式

  %ns :n代表数字,s代表string,即多个字符

  %ni : n代表数字,i代表interger,即多少整数字数

  %N.nf :n和N都是数字,f代表float,如十个位数,小数点两位为 %10.2f

awk工具 (详见sed & awk):

格式:awk ‘条件类型1{动作1} 条件类型2{动作2} ...’ filename

awk主要是处理每一行的字段内的数据,而默认的字段的分割符为空格键或tab键

变量:

NF : 每一行($0)拥有的字段总数

NR :目前awk所处理的是“第几行”数据

FS :目前的分隔字符,默认是空格键

逻辑运算符:

>  <  >=  <=  ==  !=

例:

cat /etc/passwd | awk ‘{FS=":"} $3<10 {print $1 "\t" $3}‘

cat pay.txt | awk ‘{if(NR==1) printf "%10s %10s,%10s\n",$1,$4,"Total"} NR>=2 {total=$1+$4 printf "%10s %10d %10.2f\n",$1,$3,total}‘

文本比较工具diff:

diff用于比较两个文件之间的区别,并且是以行为单位的,diff也可以比较两个目录

格式:diff [-bBi] from-file to-file

-b :忽略一行当中仅有多个空白的区别(如“about me”和“about           me”视为相同)

-B:忽略空白行的区别

-i:忽略大小写的区别

patch -pN <patch_file  更新

patch -R -pN <patch_file   还原

范例:以/tmp/test内的passwd.old 与passwd.new 制作补丁文件,并更新旧版数据

diff -Naur passwd.old passwd.new >passwd.patch

更新旧文件,变成和新文件一样

patch -p0 <passwd.patch

(pathing file passwd.old)

恢复旧文件的内容

patch -R -p0 <passwd.patch

文件打印pr:

pr /etc/man.config  (打印文本文件man.config)

鸟哥的linux私房菜——第12章 正则表达式与文件格式化处理

时间: 2025-01-02 16:20:19

鸟哥的linux私房菜——第12章 正则表达式与文件格式化处理的相关文章

鸟哥的linux私房菜——第20章 启动流程、模块管理与loader

20.1 Linux启动流程分析 Linux启动过程: 按下开机电源后计算机硬件主动读取BIOS来加载硬件信息以及硬件系统的自我测试,之后系统会主动读取第一个可启动的设备(由BIOS设置),此时就可以读入引导加载程序(boot loader)了,引导加载程序指定使用那个内核文件来启动,并实际加载内核到内存中解压缩与执行,此时内核就能够在内存中活动,并检测所有硬件信息与加载适当的驱动程序来使主机运行,等内核检测硬件与加载驱动程序完毕后,就可以登录了. 1)加载BIOS的硬件信息与进行自我测试,并依

《鸟哥的Linux私房菜》13章shel script习题答案

因为感觉对Linux命令还没有多大的感觉,所以就专门找了鸟哥的书来看一下,折腾了几天看基础篇的shell部分,收获还是蛮大的,至少对Linux命令是有点感觉了,然后往前学习的一些知识,在理论知识方面也得到了一定的扩充了.先不多说,把习题的答案分享一下. <鸟哥的Linux私房菜>基础篇P398习题 (1)请新建一个script,当你执行该script的时候,该script可以显示你目前的身份(用whoami)和你目前所在的目录(用pwd). 这道题的答案已经直接给出了,直接上脚本: #!/bi

鸟哥的 Linux 私房菜(服务器) 第二章 网络基础概念

鸟哥的 Linux 私房菜(服务器) @(学习笔记)[Linux|Markdown|笔记] [TOC] 第二章 网络基础概念 2.1 网络是个什么玩意儿 OSI 七层协定 分层 负责内容 Layer 1物理层Physical Layer 由于网络媒体只能传送 0 与 1 这种位串,因此物理层必须定义所使用的媒体设备之电压与讯号等, 同时还必须了解数据讯框转成位串的编码方式,最后连接实体媒体并传送/接收位串. Layer 2数据链结层Data-Link Layer 这一层是比较特殊的一个阶层,因为

鸟哥的Linux私房菜笔记6------11章认识和学习bash

1.合法的shell与/etc/shells功能 shell有多个版本,有Bourne Shell(sh).C Shell.K Shell .TCSH等.通常Linux使用的是Bourne Again Shell(Bash),是sh的增强版 可以检查/etc/shells,查看有多少可用的shell. 将合法的shell写入/etc/shells文件,是为系统某些服务在运行过程中检查用户能够使用的shells. 当用户登录时就会取得一个shell来工作,这个shell记录在/etc/passwd

《鸟哥的Linux私房菜》7章 Linux文件与目录管理 习题答案

自己整理了一下,分享给大家,这些习题确实是非常经典的! 1.什么是绝对路径与相对路径? 绝对路径是相对于/目录的路径的,比如/home/user: 相对路径是相对于当前工作目录的,比如你的系统上有个/home/user/test目录,此时你在/home/user目录下,那么./test就是相对路径. 2.如何更改一个目录的名称?例如/home/test变为/home/test2. mv /home/test /home/test2 3.PATH这个环境变量的意义是什么? 这里先看一下PATH:

鸟哥的linux私房菜——第3章 主机规划与磁盘分区

各硬件在Linux中的文件名(/dev): IDE硬盘:/dev/hd[a-d] SCSI/SATA/USB硬盘:/dev/sd[a-p] U盘:/dev/sd[a-p] (与SATA相同) 软驱:/dev/df[0-1] 打印机:/dev/lp[0-2](25针)./dev/usb/lp[0-15](USB) 鼠标:/dev/usb/mouse[0-15](USB)./dev/psaux(PS2) 当前CD ROM/DVD ROM:/dev/cdrom 当前鼠标:/dev/mouse 磁带机:

鸟哥的linux私房菜——第5章 首次登陆与在线求助man page

1. Linux登录环境 Ctrl + Alt + [F1~F6]:文字登录界面tty1~tty6终端(输入startx启动X窗口界面) //run level 3 Ctrl + Alt + F7:图形界面桌面 //run level 5 (1)终端界面登陆的默认显示内容来自/ect/issue文件,登陆成功后默认显示[主机名@用户名 ~] $/#(提示符) //默认提示可修改 (2)注销终端界面输入exit 2. 在命令行模式下执行命令(命令行模式登录后取得的程序被称为shell,因为这个程序

鸟哥的Linux私房菜第零章

CPU从主存中读取数据通过微指令集控制和进行计算.主存储器内的数据则是从输入单元所传输进来,而CPU处理完毕的数据也必须要先写回主存储器中, 最后数据才从主存储器传输到输出单元.内存又称主存,是CPU能直接寻址的存储空间,由半导体器件制成.内存的特点是存取 速度快.内存是电脑中的主要部件,它是相对于外存而言的.存储器的种类很多,按其用途可分为主存储器和辅助存储器,硬盘与光盘.U盘一样属于辅助存储器.CPU 的种类 通过指令集区分指令集主要分为精简指令集RISC和复杂指令集CISC精简指令集执行速

鸟哥的Linux私房菜 第0章 计算机概论要点

计算机的定义:"接受用户输入指令与数据,经由中央处理器的数据与逻辑单元运算处理后,以产生或存储成有用的信息". 计算机的五大单元包括:输入单元.输出单元.CPU内部的控制单元.算术逻辑单元与内存五大部分. 数据会流入/流出内存是CPU所发布的指令,而CPU实际要处理的数据则完全来自于内存. CPU依设计理念主要分为精简指令集(RISC)与复杂指令集(CISC)系统. 关于CPU的频率部分,外频指的是CPU与外部组件进行数据传输时的速度,倍频则是CPU内部用来加速工作性能的一个倍数,两者