博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux shell正则表达式-sed-awk-grep应用
阅读量:4170 次
发布时间:2019-05-26

本文共 6355 字,大约阅读时间需要 21 分钟。

Linux shell正则表达式-sed-awk-grep应用

概述正则表达式

正则表达式就是为了处理大量的文本|字符串而定义的一套规则和方法

* 代表匹配任意长度的字符

? 代表匹配任意单个字符

[ ]  代表指定范围的单子字符

^    指向一行的开头

$    指向一行的结尾

.      任意单个字符

[]   字符范围。如[a-z]

[list]   匹配list中的任意单一字符       a[xyz]b  a与b之间有且只有一个字符, 且只能是x或y或z, 如: axb, ayb, azb。

 [!list]        匹配除list中的任意单一字符   a[!0-9]b  a与b之间有且只有一个字符, 但不能是数字, 如axb, aab, a-b等

 [c1-c2]    匹配c1-c2中的任意单一字符   a[0-9]b  a与b之间有且只有一个字符,该字符是0-9之间的数字,如a0b, a1b,... ,a9b。

1) ^ :例如 ^word 以word开头的内容

2)$ :例如 word$ 以word结尾的内容

3)^$ :空行

4). :表示且只能代表任意一个字符(当前目录,加载文件)

5)\ :转移字符,让有着特殊身份的字符,变回原来的字符。

6)* :重复0个或多个前面的一个字符,不代表所有。

7).* :匹配所有的字符。^.* 任意多个字符开头。

8)[abc] :匹配字符集合内任意一个字符[a-z]

9)[^abc] :^在中括号表示非,表示不包含a或者b或者c

 

概述grep-sed-awk

根据专家指出Linux经常使用的命令只有两个。Ls和grep,这个命令是用来在文件中搜索满足特定要求的内容。Grep还有两个变种egrep 和fgrep 命令。在linux系统上使用频率比较高但也比较复杂的工具,它们是sed和awk命令,专家称这些工具(程序)为过滤器。

linux中最为常用的三大文本(awk,sed,grep)处理工具之一,掌握好其用法是很有必要的。Xnf9991

grep 查找 , sed 编辑, awk 根据内容分析并处理,grep(文本生成器),sed(流编辑器),awk(报表生成器)。

grep: (关键字: 截取) 文本搜集工具, 结合正则表达式非常强大

awk:AWK一次处理是一行, 而一次中处理的最小单位是一个区域

sed: (关键字: 编辑) 以行为单位的文本编辑工具

二 grep

可以通过使用grep、egrep 和fgrep 命令来搜索文件中满足特定模式(pattern)或字符串的内容。

Grep 是 Global Regular Expression Print 的缩写,它搜索指定文件的内容,匹配指定的模式,默认情况下输出匹配内容所在的行。

2.1grep 命令常用选项与帮助

1 grep命令

用法: grep [选项]... PATTERN [FILE]...

    OPTIONS:选项

    pattern正则表达式 

2 grep帮助

grep –help

3选项常用参数

 

 -E, --extended-regexp    使用扩展正则表达式 【不用使用 \ 了】,说白了,就是传递多个参数。使用|

grep -E 'pattern1|pattern2' filenam

-c: 仅列出包含模式的行数。

-i: --ignore-case忽略模式中的字母大小写

 -l: 列出带有匹配行的文件名。.

 -n: 在每行的最前面列出行号。

 -v: 列出没有匹配模式的行。

 -w: --word-regexp  单词匹配把表达式作为一个完整的单字来搜寻,忽略那些部分匹配的行。

-v:显示不包含匹配文本的所有行

-R:递归查询子目录

-A n(数字) 找到所有的匹配行,并显示匹配行前面N行

-B n(数字) 找到所有的匹配行,并显示匹配行前面N行

-m n(数字) 最多匹配N个后停止

 

4 pattern正则表达式主要参数:

\:忽略正则表达式中特殊字符的原含义。

^:匹配正则表达式的开始行。

$:匹配正则表达式的结束行。

\<:从匹配正则表达式的行开始。

\>:到匹配正则表达式的行结束。

[]:单个字符,如[A]即A符合要求。

[ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求。

.:所有的单个字符。

*:有字符,长度可以为0。

 

2.2 grep使用实例

1 查找包含1024

 

[root@pg11m data]# grep  1024 postgresql.conf

#track_activity_query_size = 1024 # (change requires restart)

2 搜索文件

 

[root@pg11m ~]# ls -l /usr/local/pgsql/data/ | grep conf

-rw------- 1 postgres postgres    5146 3月   4 22:57 pg_hba.conf

-rw------- 1 postgres postgres    1636 3月   4 22:53 pg_ident.conf

-rw------- 1 postgres postgres      88 3月   4 22:53 postgresql.auto.conf

-rw------- 1 postgres postgres   24702 3月   4 22:57 postgresql.conf

 

3多个文件查找

[root@pg11m data]# grep MB postgresql.conf postgresql.auto.conf

postgresql.conf:log_rotation_size = 10MB

postgresql.auto.conf:# 1024MB

4递归查询目录包含mem的文件

[root@pg11m ~]# grep -r 'mem' /usr/local/

/usr/local/pgsql/include/server/pgstat.h: * the memory barriers should theoretically be sufficient.

/usr/local/pgsql/include/server/pgstat.h: * to the shared memory. It contains the backend status as a first member.

/usr/local/pgsql/include/server/pgstat.h:extern Size BackendStatusShmemSize(void);

5反向查找不包含#的配置

[root@pg11m ~]# grep -v '#' /usr/local/pgsql/data/postgresql.conf

log_directory = 'log'

log_filename = 'postgresql-%Y-%m-%d'

log_destination = 'csvlog'

logging_collector = on

log_truncate_on_rotation = on

log_rotation_size = 10MB

log_min_duration_statement = 1s

log_checkpoints = on

log_connections = on

log_disconnections = on

log_error_verbosity = verbose 

log_lock_waits = on

log_statement = 'ddl'

shared_preload_libraries = 'pg_cron,repmgr,pg_stat_statements'

6 至显示几行

[root@pg11m ~]# grep -Ev '#|^$' -m 5 /usr/local/pgsql/data/postgresql.conf

max_wal_size = 1GB

min_wal_size = 80MB

log_timezone = 'PRC'

datestyle = 'iso, ymd'

timezone = 'PRC'

7 –E 扩展

[root@pg11m data]# grep -E 'MB|auto' postgresql.conf

说白了,就是传递多个参数。使用|

#log_rotation_size = 10MB        # Automatic rotation of logfiles will

#autovacuum = on                 # Enable autovacuum subprocess?  'on'

#log_autovacuum_min_duration = -1  # -1 disables, 0 logs all actions and

8 匹配行首^,匹配行尾$

匹配行首包括#的字段

grep -n '^#' /usr/local/pgsql/data/postgresql.conf

[root@pg11m data]# grep -n '^#' /usr/local/pgsql/data/postgresql.conf

匹配行尾以B结束的字段

[root@pg11m data]# grep -n 'B$' /usr/local/pgsql/data/postgresql.conf

334:#effective_cache_size = 4GB

586:#gin_pending_list_limit = 4MB

697:temp_buffers = 64MB

714:log_rotation_size = 10MB

 

2.5 高级用法

 1 去除#和空格查看postgres配置文件

[root@pg11m data]# grep -Ev '#|^$' postgresql.conf

max_wal_size = 1GB

min_wal_size = 80MB

log_timezone = 'PRC'

datestyle = 'iso, ymd'

timezone = 'PRC'

default_text_search_config = 'pg_catalog.simple'

listen_addresses = '*'     

port = 5432 

max_connections=1000            

superuser_reserved_connections = 10     

shared_buffers = 1500MB 

effective_cache_size = 1GB

三 sed

在UNIX或Linux系统中,流过管道线的信息(数据)就叫做流(stream)。 为了编辑或修改- -条管道中的信息,似乎顺理成章的就是使用流编辑器(stream editor),这也正是sed这个命令的名字的由来。其中,s是stream的第1个字母,而ed是editor (编辑器)的头两个字母。

3.1 sed命令与帮助

[root@pg11m /]# sed –help

sed [options] 'command' file(s)

 sed [options] -f scriptfile file(s)

 

参数说明:

-e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。

-f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。

-h或--help 显示帮助。

-n或--quiet或--silent 仅显示script处理后的结果。

-V或--version 显示版本信息。

命令

a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~

c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!

d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;

i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);

p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~

s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

 

四 awk

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

awk也是-个非常棒的数据处理工具!相较于sed常常作用于一整个行的处理,awk则比较倾向于一行当中分成数个“字段"来处理。因此,awk相当的适合处理小型的数据数据处理呢!awk通常运行的模式是这样的:

https://images2015.cnblogs.com/blog/1089507/201701/1089507-20170126222420597-662074402.jpg

4.1 awk命令与帮助

1 常用命令选项

-F:指定分隔符,可省略(默认空格或者Tab位)

  -f:调用awk脚本尽心个处理
  -v:调用外部shell变量

2运算符

运算符       描述

= += -= *= /= %= ^= **=        赋值

?:                           C条件表达式

||                           逻辑或

&&                         逻辑与

~ 和 !~                    匹配正则表达式和不匹配正则表达式

< <= > >= != ==                关系运算符

空格                         连接

+ -                          加,减

* / %                  乘,除与求余

+ - !                   一元加,减和逻辑非

^ ***                  求幂

++ --                 增加或减少,作为前缀或后缀

$                     字段引用

in                 数组成员

 

4.2 实例

1 awk指定分隔符

awk -F : '{print $1}' passwd

[root@pg11m /]# awk -F : '{print $1}' passwd

tcpdump:x:72:72::/:/sbin/nologin

yxy:x:1000:1001:yxy:/home/yxy:/bin/bash

postgres:x:1001:1002::/home/postgres:/bin/bash

[root@pg11m data]# awk -F ":" '{print $7}' /etc/passwd

/bin/bash

/sbin/nologin

/sbin/nologin

2awk -v设置变量

awk -va=jjj -F: '{print $1a}' passwd

[root@pg11m /]# awk -va=jjj -F: '{print $1a}' passwd

ntpjjj

tcpdumpjjj

yxyjjj

postgresjjj

3

五 综合用法

4.1 Linux 杀掉所有Java进程

1.Linux查看所有Java进程

ps -ef | grep java | grep -v grep 

(是在列出的进程中去除含有关键字"grep"的进程)

2. 使用awk分割结果,获取PID

awk '{print $2}'

ps -ef | grep java | grep -v grep | awk '{print $2}'

3. 杀死进程 kill -9 PID

xargs 作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题

ps -ef | grep java | grep -v grep | awk '{print $2}' | xargs kill -9

 

转载地址:http://rtbai.baihongyu.com/

你可能感兴趣的文章
XHProf-php轻量级的性能分析工具
查看>>
就在昨天,全球 42 亿 IPv4 地址宣告耗尽!
查看>>
Jackson Tree Model Example
查看>>
常用js收集
查看>>
如何防止sql注入
查看>>
springmvc传值
查看>>
在Eclipse中查看Android源码
查看>>
[转]C语言printf
查看>>
对话周鸿袆:从程序员创业谈起
查看>>
Mysql中下划线问题
查看>>
Xcode 11 报错,提示libstdc++.6 缺失,解决方案
查看>>
vue项目打包后无法运行报错空白页面
查看>>
1136 . 欧拉函数
查看>>
面试题:强制类型转换
查看>>
Decorator模式
查看>>
Template模式
查看>>
Observer模式
查看>>
高性能服务器设计
查看>>
图文介绍openLDAP在windows上的安装配置
查看>>
Pentaho BI开源报表系统
查看>>