Shell脚本工具

1.grep
grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。Linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。
工作方式:
它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容。
shell脚本下grep
grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。
grep选项
匹配模式选择:
-E, –extended-regexp 扩展正则表达式egrep
-F, –fixed-strings 一个换行符分隔的字符串的集合fgrep
-G, –basic-regexp 基本正则
-P, –perl-regexp 调用的perl正则
-e, –regexp=PATTERN 后面根正则模式,默认无
-f, –file=FILE 从文件中获得匹配模式
-i, –ignore-case 不区分大小写
-w, –word-regexp 匹配整个单词
-x, –line-regexp 匹配整行
-z, –null-data 一个 0 字节的数据行,但不是空行

杂项:
-s, –no-messages 不显示错误信息
-v, –invert-match 显示不匹配的行
-V, –version 显示版本号
–help 显示帮助信息
–mmap use memory-mapped input if possible

输入控制:
-m, –max-count=NUM 匹配的最大数
-b, –byte-offset 打印匹配行前面打印该行所在的块号码。
-n, –line-number 显示的加上匹配所在的行号
–line-buffered 刷新输出每一行
-H, –with-filename 当搜索多个文件时,显示匹配文件名前缀
-h, –no-filename 当搜索多个文件时,不显示匹配文件名前缀
–label=LABEL print LABEL as filename for standard input
-o, –only-matching 只显示一行中匹配PATTERN 的部分
-q, –quiet, –silent 不显示任何东西
–binary-files=TYPE 假定二进制文件的TYPE 类型;TYPE 可以是binary',text’, 或`without-match’
-a, –text 匹配二进制的东西
-I 不匹配二进制的东西
-d, –directories=ACTION 目录操作,读取,递归,跳过
-D, –devices=ACTION 设置对设备,FIFO,管道的操作,读取,跳过
-R, -r, –recursive 递归调用
–include=PATTERN 只查找匹配FILE_PATTERN 的文件
–exclude=PATTERN 跳过匹配FILE_PATTERN 的文件和目录
–exclude-from=FILE 跳过所有除FILE 以外的文件
-L, –files-without-match 匹配多个文件时,显示不匹配的文件名
-l, –files-with-matches 匹配多个文件时,显示匹配的文件名
-c, –count 显示匹配了多少次
-Z, –null 在FILE 文件最后打印空字符

文件控制:
-B, –before-context=NUM 打印匹配本身以及前面的几个行由NUM控制
-A, –after-context=NUM 打印匹配本身以及随后的几个行由NUM控制
-C, –context=NUM 打印匹配本身以及随后,前面的几个行由NUM控制
-NUM 根-C的用法一样的
–color[=WHEN],
–colour[=WHEN] 使用标志高亮匹配字串;
-U, –binary 使用标志高亮匹配字串;
-u, –unix-byte-offsets 当CR 字符不存在,报告字节偏移(MSDOS 模式

grep常见用法

grep "hello" file //在file文件中查看是否有hello 
grep -v --color 'failed' /var/log/messages //包含了failed则不显示
echo "abcd1234" |grep --color '[a-z]' //匹配a-z中任意一个字符
echo "aabcd111a1" |grep -E --color 'a?' //匹配字符串中所有出现的a
grep -E --color '^1[34578][0-9]{9}$' file //匹配电话号
grep -E "[1-9]+" 或 egrep "[1-9]+" //使用正则表达式 -E 选项
echo this is a test line. | grep -o -E "[a-z]+\." line. 或 echo this is a test line. | egrep -o "[a-z]+\." line. //只输出文件中匹配到的部分 -o 选项
grep -c "text" file_name //统计文件或者文本中包含匹配字符串的行数 -c 选项
grep "text" -n file_name 或 cat file_name | grep "text" -n 
//#多个文件 grep "text" -n file_1 file_2//输出包含匹配字符串的行数 -n 选项
grep -l "text" file1 file2 file3... //搜索多个文件并查找匹配文本在哪些文件中
//更多用法请参考:http://man.linuxde.net/grep

2.sed
sed意为流编辑器(Stream Editor)。
sed命令是利用script来处理文本文件。
sed可依照script的指令,来处理、编辑文本文件。
sed默认安照Basic规范基本匹配。
Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
模式空间
sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space)

sed命令
a\:在当前行后面加入一行文本。
b : label分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
c\:用新的文本改变本行的文本。
d :从模板块(Pattern space)位置删除行。
D :删除模板块的第一行。
i\:在当前行上面插入文本。
h :拷贝模板块的内容到内存中的缓冲区。
H :追加模板块的内容到内存中的缓冲区
g :获得内存缓冲区的内容,并替代当前模板块中的文本。
G :获得内存缓冲区的内容,并追加到当前模板块文本的后面。
l :列表不能打印字符的清单。
n :读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
N :追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
p :打印模板块的行。
P :(大写)打印模板块的第一行。
q :退出Sed。
r :file从file中读行。
t :labelif分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
T :label错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
w :file写并追加模板块到file末尾。
W :file写并追加模板块的第一行到file末尾。
! :表示后面的命令对所有没有被选定的行发生作用。
s/re/string :用string替换正则表达式re。
= :打印当前行号码。
‘#’ :把注释扩展到下一个换行符以前。
以下的是替换标记g表示行内全面替换。
p :表示打印行。
w :表示把行写入一个文件。
x :表示互换模板块中的文本和缓冲区中的文本。
y :表示把一个字符翻译为另外的字符(但是不用于正则表达式)
sed选项
-e script或–expression=script以选项中指定的script来处理输入的文本文件。
-f script文件或–file=script文件以选项中指定的script文件来处理输入的文本文件。
-h或–help 显示帮助。
-n或–quiet或–silent 仅显示script处理后的结果。
-V或–version 显示版本信息。
退出状态
sed不向grep一样,不管是否找到指定的模式,它的退出状态都是0。只有当命令存在语法错误时, sed的退出状态才不是0。
sed的处理流程
1.读入新的一行内容到缓存空间;
2.从指定的操作指令中取出第一条指令,判断是否匹配pattern;
3.如果不匹配,则忽略后续的编辑命令,回到第2步继续取出下一条指令;
4.如果匹配,则针对缓存的行执行后续的编辑命令;完成后,回到第2步继续取出下一条指令;
5.当所有指令都应用之后,输出缓存行的内容;回到第1步继续读入下一行内容;
6.当所有行都处理完之后,结束;
sed用法实例

sed 's/hello/hellos/' file //将file中的hello字符串换成hellos
sed -n 's/test/TEST/p' file//-n选项和p命令一起使用表示只打印那些发生替换的行
sed -i 's/hello/hellos/g' file//直接编辑文件选项-i,会匹配file文件中每一行的第一个hello替换为hellos
//使用后缀 /g 标记会替换每一行中的所有匹配:
sed 's/book/books/g' file 
当需要从第N处匹配开始替换时,可以使用 :/Ng: 
echo sksksksksksk | sed 's/sk/SK/2g' skSKSKSKSKSK 
echo sksksksksksk | sed 's/sk/SK/3g' skskSKSKSKSK 
echo sksksksksksk | sed 's/sk/SK/4g' skskskSKSKSK

**//界定符**:
//以上命令中字符 / 在sed中作为定界符使用,也可以使用任意的定界符:
sed 's:test:TEXT:g' 
sed 's|test|TEXT|g' 
//定界符出现在样式内部时,需要进行转义: 
sed 's/\/bin/\/usr\/local\/bin/g'

**//删除操作**:
sed '/^$/d' file  //d命令 删除空白行 
sed '2d' file //删除文件的第2行
sed '2,$d' file //删除文件的第2行到末尾所有行
sed '$d' file //删除文件最后一行
sed '/^test/'d file //删除文件中所有开头是test的行

**//打印奇数行或偶数行** 
//方法1: 
sed -n 'p;n' test.txt #奇数行 
sed -n 'n;p' test.txt #偶数行 
//方法2: 
sed -n '1~2p' test.txt #奇数行 
sed -n '2~2p' test.txt #偶数行

//更多用法实例请参考:http://man.linuxde.net/sed

3.awk
awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。
常用命令选项
-F fs fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:
-v var=value 赋值一个用户定义变量,将外部变量传递给awk
-f scripfile 从脚本文件中读取awk命令 -m[fr] val 对val值设置内在限制,
-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。
模式
/正则表达式/:使用通配符的扩展集。
关系表达式:使用运算符进行操作,可以是字符串或数字的比较测试。
模式匹配表达式:用运算符~(匹配)和~!(不匹配)。
BEGIN语句块、pattern语句块、END语句块
awk的工作原理
awk ‘BEGIN{ commands } pattern{ commands } END{ commands }’
第一步:执行BEGIN{ commands }语句块中的语句;
第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
第三步:当读至输入流末尾时,执行END{ commands }语句块。
BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。
END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。
pattern语句块中的通用命令是最重要的部分,它也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值