特殊字符子集
特殊字符 | 含义 |
---|---|
[: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处理数据的流程如下:
- 读入第一行,并将第一行的数据填入 $0, $1, $2… 等变量当中;
- 依据 “条件类型” 的限制,判断是否需要进行后面的 “动作”;
- 做完所有的动作与条件类型;
- 若还有后续的“行”的数据,则重复上面 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