本文共 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
根据专家指出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、egrep 和fgrep 命令来搜索文件中满足特定模式(pattern)或字符串的内容。
Grep 是 Global Regular Expression Print 的缩写,它搜索指定文件的内容,匹配指定的模式,默认情况下输出匹配内容所在的行。
用法: grep [选项]... PATTERN [FILE]...
OPTIONS:选项
pattern正则表达式
grep –help
-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个后停止
\:忽略正则表达式中特殊字符的原含义。
^:匹配正则表达式的开始行。
$:匹配正则表达式的结束行。
\<:从匹配正则表达式的行开始。
\>:到匹配正则表达式的行结束。
[]:单个字符,如[A]即A符合要求。
[ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求。
.:所有的单个字符。
*:有字符,长度可以为0。
[root@pg11m data]# grep 1024 postgresql.conf
#track_activity_query_size = 1024 # (change requires restart)
[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
[root@pg11m data]# grep MB postgresql.conf postgresql.auto.conf
postgresql.conf:log_rotation_size = 10MB
postgresql.auto.conf:# 1024MB
[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);
[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'
[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'
[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
匹配行首包括#的字段
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
[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
在UNIX或Linux系统中,流过管道线的信息(数据)就叫做流(stream)。 为了编辑或修改- -条管道中的信息,似乎顺理成章的就是使用流编辑器(stream editor),这也正是sed这个命令的名字的由来。其中,s是stream的第1个字母,而ed是editor (编辑器)的头两个字母。
[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是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
awk也是-个非常棒的数据处理工具!相较于sed常常作用于一整个行的处理,awk则比较倾向于一行当中分成数个“字段"来处理。因此,awk相当的适合处理小型的数据数据处理呢!awk通常运行的模式是这样的:
-F:指定分隔符,可省略(默认空格或者Tab位)
-f:调用awk脚本尽心个处理 -v:调用外部shell变量运算符 描述
= += -= *= /= %= ^= **= 赋值
?: C条件表达式
|| 逻辑或
&& 逻辑与
~ 和 !~ 匹配正则表达式和不匹配正则表达式
< <= > >= != == 关系运算符
空格 连接
+ - 加,减
* / % 乘,除与求余
+ - ! 一元加,减和逻辑非
^ *** 求幂
++ -- 增加或减少,作为前缀或后缀
$ 字段引用
in 数组成员
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
awk -va=jjj -F: '{print $1a}' passwd
[root@pg11m /]# awk -va=jjj -F: '{print $1a}' passwd
ntpjjj
tcpdumpjjj
yxyjjj
postgresjjj
3
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/