> 文章列表 > Shell编程(三)grep sed awk文本处理三剑客

Shell编程(三)grep sed awk文本处理三剑客

Shell编程(三)grep sed awk文本处理三剑客

上一章:

Shell编程(二)_做测试的喵酱的博客-CSDN博客

一、ps命令

指令: ps
作用: 主要是查看服务器的进程信息
选项含义:
-e:等价于 ‘-A’ ,表示列出全部的进程
-f:显示全部的列(显示全字段) 

二、 grep

grep主要用于过滤。对文本按行来过滤。如果某一行包含要搜索的关键字,则会把这一整行输出出来。

2.1 grep基础使用方法

查看grep 帮助文档 grep --help

[root@ecs-39233 chenshuai]# grep --help
Usage: grep [OPTION]... PATTERN [FILE]...
Search for PATTERN in each FILE or standard input.
PATTERN is, by default, a basic regular expression (BRE).
Example: grep -i 'hello world' menu.h main.c

grep应用的两种形式

形式一:对一个文件/多个文件,进行搜索。

grep [OPTION]... PATTERN [FILE1,FILE2 ... ]

[OPTION] 可选项,可填写以下内容 

PATTERN 关键字,被搜索的关键字。从文件FILE1 FILE2 搜索包含关键字 PATTERN 的行。

 形式二:执行命令时,在命令结果中搜索数据

some command | grep [option] pattern

[OPTION] 可选项,可填写以下内容 

PATTERN 关键字,被搜索的关键字。可以有没有引号,可以单引号,可以双引号。

如果没有引号,PATTERN 关键字中不能有空格。 

单引号,PATTERN 关键字中的变量不能解析,搜索的什么就是什么

双引号,可以解析PATTERN 关键字中的变量。

将一个命令(command)的输出,通过管道符|传给后面的grep命令。

在第一个命令的输出结果中,搜索关键字pattern

选项 作用
-i 忽略大小写
-c 只输出匹配行的数量
-n 显示行号
-r 递归搜索
-E 支持拓展正则表达式
-W 匹配整个单词
-I 只列出匹配的文件名
-F 不支持正则,按字符串字面意思进行匹配

例子1

搜索在当前Linux系统中(/etc/passwd),是否存在某一个用户。

是否存在root用户

grep root /etc/passwd
[root@ecs-39233 ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@ecs-39233 ~]# 

是否存在miao用户

[root@ecs-39233 ~]# grep miao /etc/passwd
[root@ecs-39233 ~]# 

例子2 

查看当前系统,java进程信息

ps -ef |grep java

查看tomcat进程信息

ps -ef |grep tomcat

例子3  忽略大小写 -i

忽略大小写 -i

grep 默认不忽略大小写。 grep -i 忽略大小写。

不忽略大小写

[root@ecs-39233 ~]# echo "Hello world" |grep hello
[root@ecs-39233 ~]# 

忽略大小写

[root@ecs-39233 ~]# echo "Hello world" |grep -i hello
Hello world

例子3  统计总数量 -c

统计总数量 -c

查看Linux用户文件。/etc/passwd

[root@ecs-39233 ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

这种nologin结尾的用户,是没有登录权限的用户。

统计一下 /etc/passwd 中,有多少个用户没有登录权限。-c

[root@ecs-39233 ~]# grep -c "/sbin/nologin" /etc/passwd
16

例子4 搜索多个文件

1、搜索多个文件

在 test_while.sh test_read_n.sh 这两个文件中,搜索"/bin/bash" 字符串

[root@ecs-39233 ~]# grep "/bin/bash" test_while.sh test_read_n.sh
test_while.sh:#!/bin/bash
test_read_n.sh:#!/bin/bash

2、对目录进行过滤 -r

我想在/chenshuai 目下,对所有的文件进行搜索。搜索"/bin/bash" 字符串

grep -r "/bin/bash" /chenshuai
[root@ecs-39233 chenshuai]# grep -r "/bin/bash" /chenshuai
/chenshuai/study_shell.sh:#!/bin/bash
/chenshuai/until.sh:#!/bin/bash
/chenshuai/miao_test.sh:#!/bin/bash

3、过滤时,只打印文件名称。不打印命中的字符串 -l

grep -rl "/bin/bash" /chenshuai
/chenshuai/study_shell.sh
/chenshuai/until.sh
/chenshuai/miao_test.sh

2.2 grep + 正则

2.2.1 基础正则

^ 以x开头$ 以x结尾.*[][^]

 

在文件中搜索,以"r"开头的字符串

grep '^r' /etc/passwd

 

2.2.2 扩展正则 grep -E 或者 egrep

扩展正则:(常用)

 {}()|+?

在 文件中,匹配手机号

grep -E '^1[3456789]\\d{9}$' /etc/xxx.log
egrep '^1[3456789]\\d{9}$' /etc/xxx.log

二、 sed

流编辑器,对文件逐行进行处理

两种形式

三、 awk