linux 正则表达式与文件格式处理

特殊字符子集
特殊字符 含义
[:alnum:] 代表大小写字母和数字的组合
[:alpha:] 代表大小写字母的组合
[:blank:] 代表空格或tab键
[:cntrl:] 代表键盘上面的控制键,如:Ctrl、Alt、Shift、Del等
[:digit:] 代表数字的组合
[:graph:] 除了空格和tab键外的所以按键
[:lower:] 小写字符a-z
[:print:] 所以可以被打印出来的字符
[:punct:] 所以标点符号的组合
[:upper:] 大写字符A-Z
[:space:] 所以能产生空格的字符
[:xdigit:] 代表16进制的数字类型

特殊字符一般用于正则表达式,用法如:
[[:digit:]]用于匹配数字字符
[^[:lower:]]在[]内的^代表非的意思,这里是匹配非小写字符

基础正则表达式字符
re字符 意义
^word 代表匹配word开头的行
word$ 代表匹配word结尾的行,^$表示空白的行
. 代表一定有一个任意字符包括空格如a.a匹配的可以是aaa、aba、a1a、a?a、a a等
\ 转义字符
* 将前一个re字符重复0到无限个如abb*,在*前面的b可以是0个或无限个b,所以匹配到的是ab、abb、abbbb;而.*则代表至少有一个到无限个任意字符
[last] 用于匹配[]内的任意一个字符如:a[abc]c,匹配的可以是aac、abc、acc
[a-b] [0-9]任意一个数字[a-z]任意一个小写字母[A-Z]任意一个大写字母;[0-9][0-9]*表示至少有1个到无限个数字
[^list] 反向选择[]内的字符,在[]内的字符就不会被匹配到
\{a,b\} 将这个表达式前的re字符重复a到b个如:go\{2,4\}d,可以匹配到的是good、goood、gooood;[0-9]\{11\}表示11个数字的组合;[a-z]\{3,\}同表示3个以上的小写字母组合

基础正则表达式字符一般配合grep工具使用,其中grep -v表示反向选择。

sed

sed为管道工具,可以用于分析stdin的数据,使用它可以对数据进行新增、删除、取代、截取等功能。
sed [-nefr] 动作
-n sed默认是将所有内容输出到屏幕,加上-n之后只会输出经sed处理过的内容。
-e 直接在命令行上面进行sed的动作编辑。
-f 直接将sed的动作写入一个文件内,-f filename可以执行filename内的sed动作。
-r 使sed支持延伸型正则表达式。
-i 直接修改读取文件的内容,且不会输出到屏幕。
sed的动作格式:n1,n2func
func 有一下几种功能:
a 增加a后面接的字符串可以在指定的一行下面新增一行并插入内容
例:
在/etc/passwd的1-3行每一行下面插入add

cat /etc/passwd | sed '1,3a add'
root:x:0:0:root:/root:/bin/bash
add
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
add
bin:x:2:2:bin:/bin:/usr/sbin/nologin
add
sys:x:3:3:sys:/dev:/usr/sbin/nologin
......

c 将c后面接的字符串用来取代指定的那些行
例:
将/etc/passwd的2-5行替换为change:

cat /etc/passwd | sed '2,5c change'
root:x:0:0:root:/root:/bin/bash
change       # 2-5行被替换成1行内容
games:x:5:60:games:/usr/games:/usr/sbin/nologin
......

i 插入i后面的字符串到指定行的上一行
例:
在/etc/passwd的1-3行的每一行上面插入insert:

cat /etc/apsswd | sed '1,3i insert'
insert
root:x:0:0:root:/root:/bin/bash
insert
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
insert
bin:x:2:2:bin:/bin:/usr/sbin/nologin
......

d 删除指定的行的内容
例:
删除/etc/passwd的3到最后一行:

cat /etc/passwd | sed '3,$d'
root:x:0:0:root:/root:/bin/bash    # 剩下2行
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin     

p 将某一行打印出来,需要和-n一起使用
例:
打印/etc/passwd 的第三行内容出来

cat /etc/passwd | sed -n '3p'
bin:x:2:2:bin:/bin:/usr/sbin/nologin

s 将指定字符串替换成新的字符
例:
将/etc/passwd 1-3行的:替换成#

cat /etc/passwd | sed 's/:/#/g'
root#x#0#0#root#/root#/bin/bash
daemon#x#1#1#daemon#/usr/sbin#/usr/sbin/nologin
bin#x#2#2#bin#/bin#/usr/sbin/nologin
......

将/etc/passwd 1行的root删掉

cat /etc/passwd | sed '1s/root//g'
:x:0:0::/:/bin/bash
......
延伸正则表达式

延伸正则表达式一般配合egrep使用,egrep就是grep -e

re字符 意义
+ 重复一个或一个以上的前一个re字符,例:o+表示一个或一个以上的o
代表0个或1个的前一个re字符,例:go?d能匹配到的是gd或god
| 用或的方式找出字符串,例:gd|god|good,那么这3个字符串都会被找到
() 找出群组字符串,例:g(la|oo)d,匹配到的是glad和good
()+ 多个群组字符串的判别,例:我们要查找一个a123123123b的字符串,可以使用egrep ‘a(123)+c’,就可以匹配上
printf

printf ‘打印格式’ 实际内容一般用于格式化输出,一般会配合awk使用。

格式样式 意义
\a 警告声输出
\b 退格键
\f 清除屏幕
\n 输出新的一行
\r 回车键
\t 水平的tab键
\v 垂直的tab键
\xNN NN为2位数的数字,可以转换成字符
常见变量格式 意义
%ns n为数字,s代表这是字符串,例:$10s表示10字符长度字符串
%ni n为数字,i代表这是整数,例:$10i表示10位数的整数
%N.nf N、n都是数字,f代表这是一个浮点数,例:$8.2f表示为8位数,其中有2位是小数,如123456.12

常见变量格式默认是右对齐,在%后面跟-即为左对齐。同时格式最后都要用\n换行,不然会全部输出到一行上面。

awk

相对于sed对行的数据处理,awk擅长于对字段的数据处理,awk可以独自处理文件数据,也可以接收管道传过来的stdin数据。它可以处理每一行的每一个字段的数据,而默认是以空格或tab来分隔字段,在awk中$0代表一整行数据,$1、$2、$3…代表第一个、第二个、第三个…字段的数据。
awk ‘条件类型1{动作1} 条件类型2{动作2}…’ filename
整个awk处理数据的流程如下:

  1. 读入第一行,并将第一行的数据填入 $0, $1, $2… 等变量当中;
  2. 依据 “条件类型” 的限制,判断是否需要进行后面的 “动作”;
  3. 做完所有的动作与条件类型;
  4. 若还有后续的“行”的数据,则重复上面 1~3 的步骤,直到所有的数据都读完为止。
awk内置变量 意义
NF 每一行拥有的字段数
NR awk取用的行数,例:NR==1代表第一行;NR>=4代表4和4后面的行
FS 表示目前依据什么分隔字段,默认为空格,同时需配合BEGIN使用,例:BEGIN{FS=":"} 代表以:分隔字段

其中条件类型一般用于运用逻辑运算符决定来取用那些行的数据,这些类型都是用在{}外面,例:

awk 'NR==1 {动作}'    # 只取用第一行数据
awk 'NR>=3 {动作}'    # 取用3和3以后的行数
awk 'BEGIN {动作}'    # 从第一行开始
awk '$3<10 {动作}'    # 取用第三列数值小于10的行 

awk的动作可以进行格式化打印,需用到pinrt辅助;可以进行逻辑运算;也可以进行条件判断、循环等等。
例:
利用awk工具,将PATH的变量逐条输出

echo $PATH | awk 'BEGIN{FS=":"}{for(i=1;i<=NF;i++) print $i}'
/home/vm/anaconda3/envs/untitled/bin
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/bin
文件对比工具
diff

diff通常用于同一个文件或软件之间的新旧差异
diff [-bBi] old_file new_file
-b 忽略一个空格和多个空格之间的差异
-B 忽略空白行的差异
-i 忽略大小写

cmp

cmp是以字节来对比2个文件
cmp -l file1 file2
-l 将所有不同点都列出来,默认是仅显示第一处不同

patch

patch可以使用补丁对文件进行升级,也可以还原。先使用diff对比新旧文件,制作升级补丁,然后就可以使用patch进行更新。
diff -Naur old_file new_file > patch_file # 制作补丁
patch -pN < patch_file # 更新
patch -R -pN < patch_file # 还原

文件打印准备工具
pr

pr可以在打印前为文件添加一行标头,将时间、文件名、页码显示出来
pr filename

猜你喜欢

转载自blog.csdn.net/weixin_43275399/article/details/89603323