文本处理工具
一.grep
grep | 简易搜索 |
---|---|
grep -E = egrep | 高级搜索 |
1、简介
grep命令是一个Linux文本处理工具,它与egrep命令属于同一系列,这些命令都是用于对文件和文本执行重复搜索任务的工具。我们可以通过grep命令指定特定搜索条件来搜索文件及其内容以获取有用的信息。grep是全局搜索正则表达式并打印出匹配的行,其抓取数据是贪婪模式,即不会漏掉过滤内容,但准确性会相对降低。
2、grep 格式
grep | 匹配条件 处理文件 | 解释 |
---|---|---|
grep | root passwd | 过滤root关键字 |
grep | -i root passwd | 省略大小写 |
grep -E "\<root" | passwd root | 字符之前不能有字符 |
grep -E "root\>" | passwd root | 字符之后不能有字符 |
grep | -数字 | 显示过滤行以及上面几行和下面几行 |
grep | -n | 显示匹配的行所在行号 |
grep | -A | 显示过滤行以及下面几行 |
grep | -B | 显示过滤行以及上面几行 |
grep | -v | 反向过滤 |
grep -i root /etc/passwd
grep -E "\<root" /etc/passwd
grep -E "root\>" /etc/passwd
grep -2 "root\>" /etc/passwd
grep -n root /etc/passwd
grep -A 3 root /etc/passwd
grep -B 3 root /etc/passwd
grep root /etc/passwd -v
3、grep字符数量匹配规则
^westos | 以westos开有 |
---|---|
westos$ | 以westos结尾 |
w…s | w开头s结尾中间4个任意字符 |
…s | s结尾前面5个任意字符 |
* | 字符出现任意 |
? | 0到1次 |
+ | 1次到任意次 |
{n} | n此 |
{m,n} | m到n次 |
{0,n} | 0-n次 |
{,n} | 0-n次 |
{m,} | 最少m次 |
(lee){2} | lee字符串出现2次 |
grep c...k
grep c...k test
grep c.*k test 表示.的个数任意
grep -E c.?k test 表示.的个数为0到1个
grep -E c.{4}k test
grep -E 'c.{4}k' test
grep -E 'c.{1,4}k' test 表示.的个数为1-4个
grep -E 'c.+k' test 表示.的个数为无数个
练习题:找出/etc/passwd里面root不在句首和句末位置的行
利用反过滤
grep root /etc/passwd | grep -E "^root|root$" -v |表示并列的意思
练习题:找出可以用su切换的用户
建立脚本
vim su.sh
grep -E "/bin/bash|/bin/sh$" /etc/passwd |cut -d : -f 1
二、sed
命令格式:
sed | 参数 命令 | 处理对象 |
---|---|---|
sed | 参数 处理对象 | -f 处理规则文件 |
1)p #显示
sed -n 5p westos | 显示第五行 |
---|---|
sed -n 3,5p westos | 显示3到5行 |
sed -ne ‘3p;5p’ westos | 显示3和5行 |
sed -ne 1,5p westos | 1-5行 |
sed -ne ‘5,$p’ westos | 5到最后以行 |
sed -n ‘/^#/p’ fstab | 显示以#开头的行 |
sed -n 5p westos
sed -n 3,5p westos
sed -ne '3p;5p' westos
sed -ne '3,5p' westos
sed -ne '5,$p' westos
sed -ne '/^#/p' /etc/samba/smb.conf
2)d #删除
sed 5d westos | ##删除第五行 |
---|---|
sed ‘/^#/d’ westos | 把#开头的行删除 |
sed ‘/^UUID/!d’ westos | 除了UUID以外的行都删除 |
sed '/^#/d' westos 删除以#开头的行
sed '/kkk/d' westos
sed '/KKK/d' westos
sed '/KKK/!d' westos
sed '1d;3d' westos 删除以1,3两行
3) a #某行下添加
sed '$a hello world' westos | 最后一行下添加hello |
---|---|
sed '$a hello\nworld' westos | 最后一行下添加hello,换行添加world |
sed '/^#/a hello world' westos | 最后一行下添加hello world |
4) i #某行上插入
sed ‘5ihello westos’ westos | 在第5行上插入hello westos |
---|
5) c #替换
sed ‘/^#/c hello world’ westos | 以*开头的行换为westos |
---|---|
sed ‘5c hello world’ westos | 把第5行换为hello westos |
6)w #写入另一个文件
sed ‘/^UUID/w westofile’ westos | 把westos中UUID开头的行写入westosfile中 |
---|
7)r #整合
sed ‘5r haha’ westos | 把文件haha插入到westos的第5行 |
---|---|
sed ‘5r haha’ -i westos | 把文件haha插入到westos的第5行,并保存westos |
8)sed #字符替换
sed ‘s/ : /###/g’ westos | 将所有的:换位### |
---|---|
sed ‘s/ : /###/’ westos | 将所有行第一次出现:的地方换为### |
sed ‘1,5s/ : /###/g’ westos | 将1到5行所有出现的:换为### |
sed ‘1s/ : /###/g’ westos | 将第1行所有出现的:换为### |
sed ‘1s/ : /###/g;5s/ : /###/g’ westos | 将1和第5行出现的:换为### |
sed ‘/lp/,/shutdown/s/ : /###/g’ westos | 将lp和shutdown之间的:换为### |
sed 's/\//####/g' westos | 将全文的\替换为####(用\对/进行特别声明) |
sed ‘s@/@####@g’ westos | 将/转换为### |
sed ‘s@/@####@g’ -i westos | 把sed处理的内容保存到westos文件中 |
练习题:给每一行加行号且不换行
1、加‘=’发现没有换行
sed '=' westos
2、通过加N表示提前读取下一行,将\n转换为空格。
sed '=' westos | sed ' N;s/\n/ /g'
3、加 -i 保存到原文件
sed '=' westos | sed ' N;s/\n/ /g' -i westos
练习题:编写脚本,给http修改端口
此脚本输入数字则http改为此端口
vim jiaoben.sh
[ -z $1 ] && {
echo -e '\033[31mERRO:Please input port number following script !!\033[0m' 判断是否存在
exit
}
netstat -antlupe | grep $1 > /dev/null && {
echo -e \033[032mERROR:The port is busy !!\033 判断端口是否占用
exit
}
sed "/^Listen/cListen $1" -i /etc/httpd/conf/httpd.conf 替换端口
systemctl restart httpd 重启服务
//
3、awk
1、基本简介
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
2、awk的基本格式
awk -F 分隔符 ‘BEGIN{}{}END{} FILENAME’
NR 行数
NF 列数
FILENAME 文件名称本身
westos westos变量值
“westos” westos字符串
/bash$/ 条件
/条件1|条件2/ 条件1或者条件2
`/条件1/&&/条件2/` 条件1或者条件2
`!/条件1/&&/条件2/` 否定条件1,满足条件2的
3、常用练习
1、使用awk命令-F指定以:为分隔符截取显示test文件的第一列
2、使用awk命令,首先输出显示westos,接着-F指定以:为分隔符截取显示passwd文件的第一列,最后输出显示end
3、使用awk命令统计test文件行数:给变量N赋初值为0,awk每读取一行文件内容变量N就进行一次自加操作,最后输出变量N的值即为passwd文件的行数
4、使用awk命令以:为分隔符截取显示passwd文件中以bash结尾的行的第一列;
5、使用awk命令以:为分隔符截取显示passwd文件中以bash结尾且含有root关键字的行的第一列;
6、使用awk命令以:为分隔符截取显示passwd文件中以bash结尾且不含有root关键字(!表示不含有)的行的第一列;
7、使用awk命令以:为分隔符截取显示passwd文件中以bash结尾或含有root关键字的行的第一列
8、使用awk命令以:为分隔符截取第七列以bash结尾的行的第一列($7~表示指定第七列);使用awk命令以:为分隔符截取第七列不以bash结尾的行的第一列
练习题1:统计内存的使用量
ps -ax -o %mem|sed 1d|awk 'BEGIN {N=0} {N=N+$1} END{print N}' ##先去除第一行无用的字符,再利用N=N+$1
练习题2:统计在系统中能su切换的用户并且家目录不在/home下的用户数量
awk -F : '$6 BGEIN{N=0}!~/\/home/&&/bash$|sh$/{N++}END{print N}' /etc/passwd