文本处理有三剑客:grep sed awk
通配符:只能匹配文件名与目录名,不能匹配文件的内容
*匹配任意一个或者多个字符
?匹配任意一个字符(就是匹配单个字符)
[ ] 匹配范围内的任意单个字符
正则表达式:有一类特殊字符以及文本字符所编写的一种模式,用来处理文本当中的内容,其中的一些字符不表示字符的字面含义,表示控制或者通配的功能
基本正则表达式
字符匹配,元字符
. 匹配任意的单个字符,可以是一个汉字
\表示转义符,\.就是一个点
()括号表示分组的意思
\(\),就是括号
[ ] 匹配指定范围内的任意单个字符
[^]取反,指定范围之外的
[[:space:]]包含空格,tab键,换行的空格,回车的空格
[[:blank:]] 空白字符(空格和tab制表符)
通配符不能完全匹配大小写, 正则可以
表示匹配不是a.txt .是或者 z.txt的文件(除了不匹配a或者z,其他都匹配)
正则表达式中表示次数的表达式
*匹配前面的字符任意次,0次也行,无数次也行,有多少匹配多少,没有也行
.*匹配任意长度的字符,至少要有一次,不包括0次
\?匹配前面的字符0次或者一次,可有可无
\+ 匹配前面的字符至少1次,最多可以无数次
\{n\}匹配前面的字符等于n次,必须连续出现才能匹配
\{m,n\}匹配前面的字符,最少m次,最多n次
\{,n\}匹配前面的字符,最多n次(只要出现几次,出现都算,除非没有,只要前面的字符有,都算)
\{n,\}匹配前面的字符至少n次
位置锚定:
^ 以什么为开头,在模式的左侧 ^root
$ 以什么为结尾,在模式的右侧 r$
^root$ 用于匹配整行,而且整行中只有以后个root
^$ / ^[[:space:]]$ 匹配空行
词首锚定 \< 或者 \b
词尾锚定 \> 或者 \b
匹配整个单词
分组()
\| 表示逻辑或
扩展正则就是不写\
但是有要求 grep -E 或者egrep
练习一条命令显示出文件内容
练习
显示/etc/passwd中以sh结尾的行
查找/etc/inittab中含有“以s开头,并以d结尾的单词”模式的行
查找ifconfig命令结果中的1-255之间的整数
显示/var/log/secure文件中包含“Failed”或“FAILED”的行
在/etc/passwd中取出默认shell为bash的行
高亮显示passwd文件中冒号,及其两侧的字符
以长格式列出/etc/目录下以ns开头、.conf结尾的文件信息
sed
sed:类似于vim就是一个文本编辑器,按行来编辑和处理
主要作用是对文本内容进行增删改查
sed可以支持正则表达式,支持扩展正则表达式
sed的原理:读取 执行 显示 三个过程
读取:读取文本内容后,读取到的内容存放到临时的缓冲区,模式空间
执行:在模式空间,根据读取的文本内容,按行执行,除非指定引号,否则会遍历所有行,从上往下执行
显示:执行完后,把执行结果打印,如果要改变生效,模式空间被修改的内容会写入到指定的文件当中,只是操作,但是不最终写入文件,只展示结果,展示完后,模式空间的数据立即删除
***sed 文本内容处理工具,文件过大怎么办?
1.大型文件先分割的好
2.中型文件
sed的实际操作
sed -e '操作' 文件1 -e '操作' 文件2
只对一个文件操作,可以不加-e
常用选项
-e 条件操作选项
-f 指定脚本文件来处理输入的文件内容,把命令写在脚本里,用脚本里的命令来处理第二个文件里面的内容
-i 立即生效 慎用
-n 显示script处理之后的结果(禁止sed的默认输出)
操作符
s 替换指定字符
d 删除指定的行
a,增加在当前的下面插入指定内容
i,增加,在指定行的上面插入指定的内容
c,替换,整行替换
y,替换字符,但是替换前后的字符长度必须一致
p,打印
r,扩展正则
sed的核心就是改,删 ,增 查是没有grep强大
两种写法
sed自己有一个默认的输出,p打印会额外再来一行
-n 显示script处理之后的结果(禁止sed的默认输出)
显示行号
即显示行号,也有内容
打印指定行,寻址打印
直接打印最后一行
行号的范围打印
答应1到3行
第二行到最后一行
打印2到4行
打印2行和最后一行
奇数偶数行打印
偶数
奇数
文本过滤模式
1.对包含指定字符串的内容进行打印
应用基础正则表达式进行打印
扩展正则
***怎么样不进入文件就可以删除文件当中的内容,免交互删除?
指定行号进行删除
删除第三行,打印剩余的行
删除1到三行
删除1行和三行
匹配字符内容删除
除了含c的,其他行删除 !:取反的意思
正则表达式删除
删除空行
替换
s 替换字符串
c整行替换
y,单字符替换,前后长度要保持一致
字母字符大小写替换
首字母
全文
全部换小写
l&转换成小写的特殊符号,在使用时,需要转义符\
u&转换成大写的特殊符号,在使用时,需要转义符\
g 全部替换,如果不加,只会更改首字符
整行替换
y单字符替换
增加
a 在下一行添加
i 在上一行添加·
r 在行后读入指定文件内容
sed命令当中字符串的位置进行交换
后面1 2 3相当于文本内容分组之后输出的位置 谁是第一位 第二位 第三位
-f 指定脚本文件来处理输入的文件内容,把命令写在脚本里,用脚本里的命令来处理第二个文件里面的内容
空格换成下划线
文件1
脚本文件
****取版本号
取日志范围
awk
awk,是功能最强大的文本工具,也是按行来进行操作,对行操作完之后,可以根据指定命令来进行取列
awk的分割符,他的默认分隔符是空格,或者tab键,多个空格,它会自动压缩成一个
用法:awk选项 '模式或者条件{操作}' 文件
选项:-F 指定分割符,如果是空格,则不需要加F
-v 变量赋值
打印第一列
打印多列
答应文本里所有内容
awk 常用内置变量
$0 打印所有内容
$n 处理行的第几列
NR 处理行的行号
NF 处理当前行的字段个数,$NF就表示最后一个字段
FS 列分割符,指定文本的分割符,和F作用一直
F:分割符 FS=":"
OFS 输出文本的分割符
RS 输出分割符为回车
内置变量$n要加$,表示列的;其他的内置变量,不用加$,更不能用引号,也不能用括号,否则会被当成字符串处理
awk的打印功能 查看
为0不打印
默认为1,可以不加,为打印所有
只打印行号
打印行号,打印所有内容
打印第三行
打印1-3行
打印1和3行
偶数行打印
奇数行打印
awk运算,也支持小数运算
**和^表示求幂
***awk的内置函数:getline
1.如果getline左右两侧没有重定向符号(<>),或者没有(|)时,awk会先读第一行,但是如果加了getline,跳过第一行,读取第二行
***如果两边有重定向或者管道符,getline作用于定向输入文件
33.txt 文件内容,重定向输出到22.txt文件
文本过滤打印
awk 以root为开头的行
包含x的行
BEGIN模式
在对文件进行操作之前,会先执行BEGIN{..}模式条件或者操作命令
中间{..}是真正的用于处理文件的命令
END{..}结束语句,一般都是打印执行结果
***当前文件有多少行?
-v变量赋值,指的是改变分割符