grep命令是一个Linux文本处理工具,它与egrep命令属于同一系列,这些命令都是用于对文件和文本执行重复搜索任务的工具。我们可以通过grep命令指定特定搜索条件来搜索文件及其内容以获取有用的信息。grep是全局搜索正则表达式并打印出匹配的行,其抓取数据是贪婪模式,即不会漏掉过滤内容,但准确性会相对降低。
grep 匹配条件 处理文件名称
grep root passwd ##过滤root关键字所在的行
grep -i root passwd ##忽略大小写过滤root关键字所在的行
grep -E "\ passwd ##过滤root字符之前没有字符的行
grep -E "root\>" passwd ##过滤root字符之后没有字符的行
grep -数字 ##显示过滤行以及上面几行和下面几行
grep -n ##显示匹配的行所在行号
grep -A数字 ##显示过滤行以及下面几行
grep -B数字 ##显示过滤行以及上面几行
grep -v ##反向过滤
实验步骤:
1)切换到一个空目录/mnt中,cp /etc/passwd .
复制/etc/passwd文件到该目录(. 表示当前目录)中,避免文件内容过长删除一部分内容,使用grep命令在截取以某个字符串结尾的数据时,如果需要判断的结尾字符串有多个,需要用 | 连接多个正则表达式,但执行命令后抓取数据失败,这是因为 | 是扩展表达式,我们需要使用egrep命令才能用 | 连接多个判断字符串进行数据抓取,为了便于记忆,我们可以使用统一命令grep -E
2)编辑/mnt/passwd文件,在其中加入几行数据用来进行命令测试
3)使用grep命令过滤passwd文件中root关键字所在的行、使用-i 参数忽略大小写过滤passwd文件中root关键字所在的行,可以看到过滤结果中多了一条含有ROOT字符串的行
4)使用grep -E
命令过滤passwd文件中root字符前没有字符的行、root字符后没有字符的行
注意: grep使用"<“或”>"只能抓取匹配字符串之前或之后不能有字符串的数据,像/root也会被查找出来,这是因为/为单个字符,而不是字符串
5)使用grep命令过滤passwd文件中ROOT关键字所在行及其上、下5行;使用grep命令过滤passwd文件中ROOT关键字所在行并显示行号;使用grep命令过滤显示passwd文件中ROOT关键字所在行及下面3行;使用grep命令过滤显示passwd文件中ROOT关键字所在行及上面3行
6)使用-v参数反向过滤passwd文件中不含有root关键字的行
7)命令练习:过滤passwd文件中行首、行尾不以root开头、结尾,行中有root关键字的行并显示
正则表达式 | 含义 |
---|---|
^westos | 以westos关键字开头 |
westos$ | 以westos结尾 |
w…s | w开头s结尾中间含有3个任意字符 |
…s | s结尾前面有3个任意字符 |
* | 字符出现次数任意(即0次到任意次) |
? | 字符出现0到1次 |
+ | 字符出现1次到任意次 |
{n} | 字符出现n次 |
{m,n} | 字符出现m到n次 |
{,n} | 字符出现0到n次 |
{m,} | 字符最少出现m次 |
实验步骤:
1)切换到一个空目录/mnt中,新建并编辑文件westos如下
2)使用grep命令分别过滤westos文件中,以w开头s结尾中间含有1 / 2 / 3 / 任意个任意字符的关键字所在的行( * 表示任意字符 . 的个数任意)
3)使用grep -E
命令过滤westos文件中,以w开头s结尾中间含有4个 / 含有3个 / 最少含有3个 / 含有1到3个任意字符的关键字所在的行
4)使用grep -E
命令过滤westos文件中,以w开头s结尾中间含有0到1个 / 含有1到任意个任意字符的关键字所在的行
5)使用grep -E
命令过滤westos文件中,以w开头s结尾中间最多含有3个任意字符 / 字符e / 字符串eb的关键字所在的行
注意: 关键字的中间匹配项为字符串时,必须给字符串外加上(),这样grep命令执行时才会将其作为一个整体来处理
6)命令练习:编写脚本显示系统中能被su命令切换的用户名称
思路:/etc/passwd文件中以bash、sh结尾的行所对应的用户就是系统中能被su命令切换的用户(即有交互的shell),我们可以使用grep -E
命令过滤显示/etc/passwd文件中以bash、sh结尾的行后,通过管道使用cut命令以:为分隔符截取第一列(用户名称所在列)
sed 全名叫 stream editor即流编辑器,与 vim 的交互式编辑方式截然不同,作为一种非交互式编辑器,sed使用预先设定好的编辑指令对输入的文本进行编辑,完成之后输出编辑结果。其功能十分强大,加上正则表达式的支持,可以进行大量的复杂文本的编辑操作。
a)p :显示
sed 参数 命令 处理对象
sed -n 5p westos ##显示第5行
sed -n 3,5p westos ##显示第3行到第5行
sed -n "3p;5p" westos ##显示第3行和第5行
sed -n 1,5p westos ##显示1-5行
sed -n '5,$p' westos ##显示第5行到最后一行
sed -n '/^#/p' fstab ##显示以#开头的行
b)d :删除
sed 5d westos ##删除第5行
sed '/^#/d' fstab ##把以#开头的行删除
sed '/^UUID/!d' fstab ##删除不是以UUID开头的所有行
sed '5,$d' westos ##删除第5行到最后一行
c)a :添加
sed '$a hello world' fstab ##在最后一行后添加字符串
sed '$a hello\nworld' fstab ##在最后一行后添加字符串,使用换行符隔开
sed '/^#/a hello world' fstab ##在以#开头的行后添加字符串
d)c :替换
sed '/^#/c hello world' fstab ##将所有以#开头的行替换为指定字符串
sed '5chello world' westos ##将第5行替换为指定字符串
e)w :把符合的行写入到指定文件中
sed '/^UUID/w westofile' westos
:把westos中UUID开头的行写入westosfile中
f)i :插入
sed '5ihello westos' westos
:在westos文件的第5行前插入指定字符串
g)r :整合文件
sed '5r westofile' westos
:将westofile文件中的内容整合到westos文件的第5行后
实验步骤:
1)切换到一个空目录/mnt中,复制/etc/passwd文件到该目录(.表示当前目录)中,避免文件内容过长删除一部分内容,再cat -b westos将文件内容带行号显示并将显示结果导入到/mnt下的另一新建文件westos中(加行号是为了便于后续观察命令的执行效果)
2)我们可以使用head命令 / tail命令查看文件的前几行 / 后几行,但无法查看指定行 ,使用sed命令可以解决这一问题,如下图所示:使用sed -n
命令查看显示westos文件的第5行 / 第3行到第5行 / 最后一行 / 含有root关键词的行 / 第3行和第4行
注意: sed 5p 不加-n参数时不仅显示文件的指定行,还会显示其他所有的行,-n参数只显示文件的指定行
3)使用sed
命令删除westos文件的第5行 / 第5行和最后一行 / 第5行到最后一行 / 含有root关键词的行 / 不含有root关键词的行
注意: 使用d参数进行删除时不需要加-n,因为指定行已删除,所以无输出显示
4)使用sed
命令在第1行 / 最后一行后添加内容,这里可以使用换行符隔开添加内容中的字符串
5)使用a参数进行添加时默认添加在指定行之后,我们可以使用i参数将字符串插入到指定行之前
6)使用c参数将westos文件的第1行 / 含有root关键词的行替换为指定字符串
7)使用w参数将westos文件中含有root关键词的行写入文件file中,相当于在显示含有root关键词的行后进行了输出重定向操作
8)使用r参数将file文件中的内容整合到westos文件的第5行后,但此时查看westos文件内容无变化,这是因为整合文件时需要加入-i参数才把sed处理的内容保存到westos文件中
实验步骤:
1)切换到一个空目录/mnt中,复制/etc/passwd文件到该目录中,避免文件内容过长删除一部分内容,文件中的内容是以:分隔的,我们可以使用vim编辑passwd文件进行字符替换,也可以使用sed进行字符替换,字符替换时要用 ‘ ’ 将替换策略引起来
使用sed命令将passwd文件中每一行每一列中的:替换为###
2)=表示给文件中的每一行前加行号,但是默认加在每一行的前一行,如果想要将行号加在每一行前,我们需要通过管道将行号后的换行符\n替换为空(N表示提前加载sed处理行的下一行)
3)给passwd文件中每一行前添加行号后将显示结果输出重定向生成另一文件westos,G表示给westos文件的每一行后添加空行,$!G表示除最后一行外给westos文件的每一行后添加空行
4)使用sed命令将westos文件中第1行到第5行每一列中的:替换为###
使用sed命令将westos文件中sync关键字所在行到halt关键字所在行每一列中的:替换为###
5)使用sed命令将westos文件中第1行和第4行每一列中的:替换为###,有以下两种方式:
方法一: 在一个替换策略中写两个表达式用;隔开
方法二: 用两个-e连接两个替换策略
6)使用sed命令将westos文件中每一行每一列中的特殊字符/(表达式中需要用/隔开)替换为###,有以下两种方式:
方法一: 在 / 前加 \ 转译特殊字符
方法二: 使用 @ 符替换表达式中用来隔开的 / 符
7)命令练习:假设selinux为关闭状态,编写脚本Apache_port.sh修改http端口号
思路:首先对执行脚本时脚本后用户输入的字符串进行是否为空的判断,如果为空则退出运行并提示用户输入端口号,如果不为空则对用户输入的端口号使用lsof -i:
命令检测该端口是否被占用,如果被占用则退出运行并报错,如果未被占用则使用sed命令将httpd服务主配置文件/etc/httpd/conf/httpd.conf中的端口设定语句替换为用户输入端口号对应的端口设定语句,接着重启httpd服务
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
awk -F 分隔符 BEGIN{}{}END{} FILENAME
:这里FILENAME指的是文件名称本身
表达式 #含义
westos #westos变量值
“westos” #westos字符串
/条件1|条件2/ #条件1或者条件2
/条件1/||/条件2/ #条件1或者条件2
/条件1/&&/条件2/ #条件1且条件2
$0 #所有的列
$1 #第一列
$2 #第二列
$3 #第三列
实验步骤:
1)使用awk命令,首先输出显示westos,接着-F指定以:为分隔符截取显示passwd文件的第一列,最后输出显示end
注意: ‘ ’引起来的截取策略中的字符串需要用“ ”引起来,否则awk命令会将其当作变量处理(即不会输出显示指定字符串本身)
2)使用awk命令统计passwd文件行数:给变量N赋初值为0,awk每读取一行文件内容变量N就进行一次自加操作,最后输出变量N的值即为passwd文件的行数
3)使用awk命令-F指定以:为分隔符截取显示passwd文件的第一列
使用awk命令以:为分隔符截取显示passwd文件中以bash结尾的行的第一列;使用awk命令以:为分隔符截取显示passwd文件中以bash结尾且含有root关键字的行的第一列;使用awk命令以:为分隔符截取显示passwd文件中以bash结尾且不含有root关键字(!表示不含有)的行的第一列;使用awk命令以:为分隔符截取显示passwd文件中以bash结尾或含有root关键字的行的第一列
注意: |表示或时是一个截取条件中的两个元素,||表示或时是两个截取条件中各自的一个元素
4)使用awk命令以:为分隔符截取第七列以bash结尾的行的第一列($7~
表示指定第七列);使用awk命令以:为分隔符截取第七列不以bash结尾的行的第一列
使用awk命令以:为分隔符截取第七列不以bash结尾的行的全部列($0 表示所有的列)
5)命令练习:统计在系统中能su切换的且用户家目录不在/home下的用户数量
思路:使用awk命令以:为分隔符截取/etc/passwd文件中第六列不以/home开头的(/需要转译;不能直接写不含有home关键字,存在类似用户家目录为/tmp/home这种情况)、并且以bash或sh结尾的行,对截取结果进行计数,这里我们可以创建用户对脚本进行测试
6)命令练习:统计系统内存使用总量
思路:使用ps ax -o %mem
可以查看所有进程占用内存量,将查看结果通过管道,使用awk命令去掉字符串或内存占用为0.0所在的行后将所有值($1表示读取每一行的第一个字符串)循环+=,得到所有进程占用内存总量(字符串不去掉不影响计算结果,但会降低脚本执行效率)