目录
必要性
Linux三剑客是Linux和Unix系统中不可或缺的文本处理工具,它们各自具有独特的功能和优势,组合使用能够大大提高文本处理的效率、灵活性和准确性。
正则表达式
以下三种工具经常会与正则搭配使用,因此此处先进行正则知识的补充与简单演示
基础正则表达式
总览
符号 | 含义 |
---|---|
^ | 行首定位符 |
$ | 行尾定位符 |
. | 匹配任意一个字符 |
* | 匹配多次前面的字符 |
[ ] | 匹配括号中的任意一个均可 |
[^] | 非字符类,与括号中的都不相同 |
[ - ] | 范围类,匹配一整个范围 |
x\{m\} | 匹配字符xm次 |
x\{m,n\} | 匹配字符x,次数为m-n次 |
使用
使用如下命令,得到测试文件test.txt
head -10 /etc/passwd > test.txt
文件内容为/etc/passwd的前十行,用于正则表达式的功能测试
搜索文件中以root开头的内容
grep ^root test.txt
搜索文件中以s开头,sync结尾的内容
grep ^s.*sync$ test.txt
搜索sy或者sh开头的内容
grep ^s[yh].* test.txt
搜索不是m开头而且不是以/sbin/nologin为家目录的用户信息
grep ^[^m].*[^/sbin/nologin]$ test.txt
搜索用户名从a-c开头的用户信息
grep ^[a-c] test.txt
搜索含有一次以上o的内容
egrep o\{1,\} test.txt
扩展正则表达式
总览
符号 | 作用 |
---|---|
+ | 匹配一次或多次 |
? | 匹配0次或者一次 |
| | 或者 |
() | 用于进行分组 |
使用
匹配出现一次或者多次root的文本内容
egrep root+ test.txt
匹配以s开头而且出现了一次或者零次0的文本内容
egrep ^s.*(root)? test.txt
匹配root开头或者a开头的文本内容
grep -E ^root|^a test.txt
grep:搜索之剑
优点:快速搜索,支持正则,多种选项
分类
egrep:匹配时支持扩展正则,相当于grep -E
grep:最常使用,支持正则,但是不支持扩展正则,需要使用扩展正则可以-E或者使用egrep
fgrep:不支持正则
常见选项
-n 匹配时显示在文中的对应行号
-v 翻转输出,仅输出不含关键词的行
-o 仅输出匹配的部分,而不是整行内容
sed:流编辑器
优点:非交互式,脚本化,流编辑器
选项
-r:支持扩展正则
-i:直接修改文本内容
命令
d(delete)删除
删除root开头的内容
sed -r '/^root/d' test.txt
s(substitute)替换
将文中的root全部替换为ROOT
sed -r 's/root/ROOT/' test.txt
i(insert)插入
在第二行后面插入一行内容
sed -r '2i/root/' test.txt
c(change)更改
此处的修改时修改一整行,通常用于主配置文件来实现服务的关闭与开启
sed -ri 'c/^SELINUX=.*$/SELINUX=disabled/' /etc/selinux/config
使用上述命令可以直接实现Selinux的关闭,并且不需要进行交互,便于脚本内容的书写
awk:数据切片
优点:格式化输出,内置函数和变量,文本分析和处理
基本语法:
awk 选项 语法 文件名
使用文件:/etc/passwd
文件内容解释:
以root用户为例
一共有七项,第一项为用户名root,第二项为密码占位符,第三项为uid,第四项为gid,第五项为用户描述信息,第七项为用户家目录,第八项为用户登录shell
选项
-v:设置自定义变量,在后续命令中进行使用
内部变量及其作用:
变量名 | 含义 |
---|---|
FS | 输入字段分隔符 |
OFS | 输出字段分隔符 |
RS | 输入记录分隔符 |
ORS | 输出记录分隔符 |
-F:设置输入字段分隔符,相当与定义FS的值
处理前操作:BEGIN{}
处理操作:{}
处理后操作:END{}
命令
print 直接进行输出
也可以进行比较 常用运算符号 > < == ~
还可以进行流程控制
使用if语句,for循环,while循环等
简单输出
awk -F: -v user=root 'BEGIN{print "begin"}{if($1==user){print $1}}END{print "end"}' /etc/passwd
判断语句
使用判断语句统计系统用户与非系统用户的数量
系统用户id<1000,非系统用户id>1000
awk -F: 'BEGIN{usera=0;userb=0} {if($3<1000){usera++}else{userb++}} END{print "系统用户数量为:"usera,"非系统用户数量为:"userb}' /etc/passwd