工具之_grep,sed,awk

grep 文本过滤工具
grep egrep fgrep(不支持正则表达式搜索)
sed 文本编辑工具
awk linux上的实现gawk,文本报告生成器

grep对目标文本逐行进行匹配检查,打印匹配到的行

Grep
grep [options] pattern [file...]

[root @ centos7 data]#echo '$USER'
$USER
[root @ centos7 data]#echo "$USER"
root

--color=auto
-m # 匹配#次后停止
-v 显示不被匹配的行
-i 忽略大小写
-n 显示匹配的行号
-c 统计匹配的行数
-o 仅显示匹配到的字符串
-q 不输出任何信息
-A # 后#行
-B # 前#行
-C # 前后各#行
-e 实现多个选项间的逻辑or
-w 匹配整个单词
-E 使用ERE
-F 相当于fgrep 不支持正则表达式
-f file 根据模式文件处理

正则表达式(REGEXP)
基本正则表达式:BRE
扩展正则表达式:ERE
   grep -E ,egrep
元字符分类:
字符匹配
匹配次数
位置锚定
分组
字符匹配
. 匹配任意单个字符
[] 匹配指定范围内的任意单个字符,示例:[wang] [0-9] [a-z] [a-zA-Z]
[^] 匹配指定范围外的任意单个字符
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即A-Z, a-z
[:lower:] 小写字母
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:]水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
匹配次数
*匹配前面的字符任意次,包括0次
    贪婪模式:尽可能长的匹配
.*任意长度的任意字符
\?匹配其前面的字符0或1次
\+匹配其前面的字符至少1次
\{n\}匹配前面的字符n次
\{m,n\}匹配前面的字符至少m次,至多n次
\{,n\}匹配前面的字符至多n次
\{n,\}匹配前面的字符至少n次
位置锚定
^ 行首锚定,用于模式的最左侧
$ 行尾锚定,用于模式的最右侧
^PATTERN$ 用于模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行
\< 或\b词首锚定,用于单词模式的左侧
\> 或\b词尾锚定,用于单词模式的右侧
\<PATTERN\>匹配整个单词
分组
分组:\(\) 将一个或多个字符捆绑在一起,当作一个整体处理,如:\(root\)\+
分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ...
\1表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
示例:
\(string1\(string2\)\)
\1 :string1\(string2\)
\2 :string2
后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身
或者:\|
示例:
a\|b  a或b 
C\|cat  C或cat 
\(C\|c\)at  Cat或cat
扩展正则表达式
egrep = grep -E
egrep [options] pattern [file...]

sed

sed 一次处理一行内容
1)读取一行,把当前处理的行存储在临时缓冲区--"模式空间"
2)sed命令处理缓冲区中的内容
3)把缓冲区内容送到屏幕
4)读入下一行,执行下一个循环

sed [option]... 'script' inputfile...
-n 不输出到屏幕
-e 多点编辑
-f /path/script_file 从指定文件中读取编辑脚本
-r     支持使用扩展正则表达式
-i.bak 备份文件并原处编辑
script
'地址+命令'

地址定界:
不给地址:对全文进行处理
单地址
#
$
/pattern/
地址范围
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
步进
1~2 奇数行
2~2 偶数行

命令
d 删除模式空间匹配的行,并立即启用下一 轮循环
p 打印
a [\]text 行后追加文本,支持使用\n实现多行追加
i [\]text 在行前面插入文本
c [\]text 替换行为单行或多行文本
w /path/file
r /path/file
= 为模式空间中的行打印行号
! 模式空间中匹配行取反处理

扫描二维码关注公众号,回复: 13131205 查看本文章

搜索替换
s/// , s@@@ , s###
替换标记
g 行内全局替换
p 显示替换成功的行
w /path/file 将替换成功的行保存至文件中

高级编辑命令
P:打印模式空间开端至\n内容,并追加到默认输出之前
h: 把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g: 从保持空间取出数据覆盖至模式空间
G:从保持空间取出内容追加至模式空间
x: 把模式空间中的内容与保持空间中的内容进行互换
n: 读取匹配到的行的下一行覆盖至模式空间
N:读取匹配到的行的下一行追加至模式空间
d: 删除模式空间中的行
D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环

awk

基本用法
awk [options] 'program' var=value file...
awk [options] -f programfile var=value file...
awk [options] 'BEGIN{action;...} pattern{action;...} END{actionl;...}'  file...
program 通常被放在单引号中
program:pattern{action statements;...}
pattern:部分决定动作语句何时触发及触发事件
action statements:对数据进行处理,放在{}内;print,printf
-F "分隔符"  输入时用到的字段分隔符;默认是空行为分隔符
-v var=value 变量赋值

print格式:
print item1,item2,...
1)逗号分隔符
2)输出item可以字符串(加双引号),也可是数值;当前记录的字段、变量或awk的表达式
3)省略item 相当于print $0
变量
(内置和自定义变量)
FS  输入字段分隔符,默认空白字符
OFS 输出字段分隔符,默认空白字符
RS  输入记录分隔符,指定输入时的换行符
ORS 输出记录分隔符,输出时用指定符号代替换行符
NF  字段数量,引用变量是,变量前不需加$
NR  记录号
FNR 各文件分别计数,记录号
FILENAME 当前文件名
ARGC 命令行参数的个数
ARGV 数组,保存的是命令行所给定的各参数
printf命令
格式化输出:printf "FORMAT", item1, item2, ...
(1) 必须指定FORMAT
(2) 不会自动换行,需要显式给出换行控制符,\n
(3) FORMAT中需要分别为后面每个item指定格式符
格式符:与item一一对应
%c:显示字符的ASCII码
%d, %i:显示十进制整数
%e, %E:显示科学计数法数值
%f:显示为浮点数
%g, %G:以科学计数法或浮点形式显示数值
%s:显示字符串
%u:无符号整数
%%:显示%自身
修饰符#[.#]第一个数字控制显示的宽度;第二个#表示小数点后精度,%3.1f
-左对齐(默认右对齐)%-15s
+显示数值的正负符号%+d
操作符
算术操作符:x+y, x-y, x*y, x/y, x^y, x%y-x:转换为负数+x:将字符串转换为数值
字符串操作符:没有符号的操作符,字符串连接
赋值操作符:=, +=, -=, *=, /=, %=, ^=,++, --
比较操作符:==, !=, >, >=, <, <=
模式匹配符:
~:左边是否和右边匹配,包含
!~:是否不匹配
逻辑操作符:与&&,或||,非!
条件表达式(三目表达式)
selector?if-true-expression:if-false-expression
PATTERN:
根据pattern条件,过滤匹配的行,再做处理
(1)如果未指定:空模式,匹配每一行
(2)/regular expression/:仅处理能够模式匹配到的行,需要用/ /括起来
awk '/^UUID/{print $1}' /etc/fstab
awk '!/^UUID/{print $1}' /etc/fstab
(3)relational expression: 关系表达式,结果为"真"才会被处理
真:结果为非0值,非空字符串
假:结果为空字符串或0值
(4)line ranges:行范围startline,endline:
/pat1/,/pat2/不支持直接给出数字格式
awk-F: '/^root\>/,/^nobody\>/{print $1}' /etc/passwd
awk-F: '(NR>=10&&NR<=20){print NR,$1}' /etc/passwd
(5)BEGIN/END模式
BEGIN{}:仅在开始处理文件中的文本之前执行一次
END{}:仅在文本处理完成之后执行一次

awkaction常用的action分类
(1) Expressions:算术,比较表达式等
(2) Control statements:if, while等
(3) Compound statements:组合语句
(4) input statements
(5) output statements:print等
控制语句
{ statements;… } 组合语句
if(condition) {statements;…} 
if(condition) {statements;…} else {statements;…}
while(conditon) {statments;…}
do {statements;…} while(condition)
for(expr1;expr2;expr3) {statements;…}
break
continue
delete array[index]
delete array
exit
控制语句if-else
语法:
if(condition){statement;…}[else statement]
if(condition1){statement1}else if(condition2){statement2}else{statement3}
使用场景:对awk取得的整行或某个字段做条件判断
示例:
awk-F: '{if($3>=1000)print $1,$3}' /etc/passwd
awk-F: '{if($NF=="/bin/bash") print $1}' /etc/passwd
while循环
语法:while(condition){statement;…}
条件"真"进入循环;条件"假",退出循环
使用场景:对一行内的多个字段逐一类似处理时使用
          对数组中的各元素逐一处理时使用
示例:
awk'/^[[:space:]]*linux16/{i=1;while(i<=NF) {print $i,length($i); i++}}' /etc/grub2.cfg
do-while循环
语法:do {statement;…}while(condition)
意义:无论真假,至少执行一次循环体
示例:
awk'BEGIN{ total=0;i=0;do{ total+=i;i++;}while(i<=100);print total}’
for循环
语法:for(expr1;expr2;expr3) {statement;…}
常见用法:
for(variable assignment;condition;iterationprocess)
      {for-body}
特殊用法:能够遍历数组中的元素
语法:for(varin array) {for-body}
示例:
awk'/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}' /etc/grub2.cfg
switch语句
语法:
switch(expression) {
case VALUE1 or /REGEXP/: statement1;
case VALUE2 or /REGEXP2/: statement2;
...;
default: statementn}
break和continue
awk'BEGIN{sum=0;for(i=1;i<=100;i++){if(i%2==0)continue;sum+=i}print sum}' awk'BEGIN{sum=0;for(i=1;i<=100;i++){if(i==66)break;sum+=i}print sum}'
break [n]
continue [n]
next:提前结束对本行处理而直接进入下一行处理(awk自身循环)
awk-F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd
awk数组
关联数组:array[index-expression]index-expression:
(1)可使用任意字符串;字符串要使用双引号括起来
(2)如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串”
(3)若要判断数组中是否存在某元素,要使用“index in array”格式进行遍历
示例:
weekdays["mon"]="Monday"
awk'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";print weekdays["mon"]}'
若要遍历数组中的每个元素,要使用for循环
for(varin array) {for-body}
注意:var会遍历array的每个索引
示例:
awk'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for(iin weekdays) {print weekdays[i]}}'
awk函数
数值处理:
rand():返回0和1之间一个随机数
awk 'BEGIN{srand(); for (i=1;i<=10;i++)print int(rand()*100) }' 字符串处理:
length([s]):返回指定字符串的长度
sub(r,s,[t]):对t字符串搜索r表示模式匹配的内容,并将第一个匹配内容替换为s
echo "2008:08:08 08:08:08" | awk 'sub(/:/,"-",$1)'
echo "2008:08:08 08:08:08" | awk '{sub(/:/,"-",$1);print $0}'
gsub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并全部替换为s所表示的内容
echo "2008:08:08 08:08:08" | awk 'gsub(/:/,"-",$0)'
echo "2008:08:08 08:08:08" | awk '{gsub(/:/,"-",$0);print $0}'
split(s,array,[r]):以r为分隔符,切割字符串s,并将切割后的结果保存至array所表示的数组中,第一个索引值为1,第二个索引值为2,…netstat-tn| awk'/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for (iin count) {print i,count[i]}}’
自定义函数格式:
function name ( parameter, parameter, ... )
{ statements return expression}
示例:
cat fun.awkfunction max(x,y) {x>y?var=x:var=yreturn var}BEGIN{a=3;b=2;print max(a,b)}
awk-f fun.awk
awk脚本
将awk程序写成脚本,直接调用或执行
示例:
cat f1.awk{if($3>=1000)print $1,$3} 
awk-F: -f f1.awk /etc/passwd
cat f2.awk
#!/bin/awk–f
#this is a awkscript
{if($3>=1000)print $1,$3} 
chmod+x f2.awk
f2.awk –F: /etc/passwd
向awk脚本传递参数
格式:awkfile var=value var2=value2... Inputfile
注意:在BEGIN过程中不可用。直到首行输入完成以后,变量才可用。可以通过-v 参数,让awk在执行BEGIN之前得到变量的值。命令行中每一个指定的变量都需要一个-v参数
示例:
cat test.awk 
#!/bin/awk–f
{if($3 >=min && $3<=max)print $1,$3}
chmod+x test.awk
test.awk-F: min=100 max=200 /etc/passwd

猜你喜欢

转载自blog.51cto.com/14814545/2684965