博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux的shell脚本grep、sed、awk练习和diff、patch、cut、sort介绍
阅读量:5916 次
发布时间:2019-06-19

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

一.grep文本过滤器

1.格式grep [options][filname] 

2.常用参数选项: 

i 不区分大 小写(只适用于单字符)

E可用扩展正则表达式 egrep 

F固定字符串匹配fgrep 

A显示匹配行的后多少行

B显示匹配行的前多少行 

C显示匹配行的前后各多少行

n显示匹配行及 行号

v显示不包含匹配文本的所有行反向选择 

q:   静默模式不向屏幕输出 

注egrep为 grep 的扩充版本, 改良了许多传统 grep 不能或不便的操作. 比方说:

- grep 之下不支持 ? 与 + 这两种 modifier, 但 egrep 则可.
- grep 不支持 a|b 或 (abc|xyz) 这类"或一"比对, 但 egrep 则可.
- grep 在处理 {n,m} 时, 需用 { 与 } 处理, 但 egrep 则不需.

3.grep+基本正则表达式 

基本正则表达式字符匹配:

.   匹配任意单个字符 

[]  匹配指定范围的单个字符 

[^] 取反 支持之前讲过global的  

[[:digit:]]所有数字 

[[:lower:]]所有小写字符  

[[:upper:]]所有大写字符 

[[:alpha:]]所有字符 

[[:alnum:]]所有字符加数字 

[[:space:]]所有空格 

基本正则表达式匹配字数:

*   匹配前面的字符任意次仅表示次数 0次 1次 多次 

\?:匹配前面的字符0次或者一次前面的字符可有可无 

\+:  匹配其前面的字符至少出现一次一次或者多次 

基本正则表达式位置绑定 

^:行首绑定:出现于模式的最左侧 

$:行尾绑定:出现于模式的最右侧 

\< :词首绑定,用于单词模式的左侧 

\>:词尾绑定,用于单词模式的右侧

精确匹配

\{m\}精确匹配字符m次                      

\{m,n\}:匹配前面的字符至少m次至多n次

基本正则表达分组:

\(\):将一个或者多个字符绑定在一起当做一个整体进行处理

二.sed文本编辑工具

1.Sed命令格式   sed [options] 'command' file(s) 

                           sed [options] -f scriptfile file(s)

2.sed常用命令参数选项 

-n :不输出模式中的内容到屏幕 

-e 多点编辑 

-f :-f/path/to/script_file 从指定文件中读取编辑脚本 

-r:支持使用扩展正则表达式 -i:在原文件处操作 

3.sed编辑命令

d:删除 

p:显示  模式空间中的内容 

a\text在行后面追加文本支持使用\n实现多行追加 

i\text在行前面追加文本支持使用\n实现多行插入 

c\text换行为单行或多行文本 

w/path/to/somefile:保存模式空间中匹配到的行至指定文件中 

r/path/from/somefile:读取指定文件的文本流至模式空间中匹配到的行后 

=为模式空间中的行打印行号 

取反条件用在编辑命令后面

s/pattern/string/修饰符查找并替换 

g:全局替换

i:查找时忽略大小写 

s@@@ s### (不仅仅限于/) 

删除结尾:

删除空格:

删除1到4行

追加字符

找出UUID开头保存到test

将issue文件加到第六行

执行脚本

将开头#变为/

空行

删除多余的空格

加序号

三.awk文本报告生成器 

1.awk命令格式解析 

格式1前置命令 | awk [选项] ‘[条件]{编辑命令}’ 

格式2awk [选项] ‘[条件]{编辑命令}’文件… 编辑命令:多条语句可以用分号分隔 print是最常用的指令

2.awk常用命令 

-F指定分隔符可省略默认空格或者tab键 

-f:调用awk脚本进行处理 

-v:调用外部shell变量 

选项 -F指定输入分隔符默认为空白$0:整行显示 $1,$2..位置参数 

awk过滤处理也支持以指定的字符串作为分隔 

awk -F "in" '{print $1, $3}' /etc/passwd 

awk还识别多种单个的字符串 

awk -F [:/] '{print $1, $10}' /etc/passwd

3.awk的内置变量有特殊含义可直接使用使用 

NR:awk命令所处理的记录数所处理的文件的所有行 

FNR:相对于当前读取的文件来说所处理的记录数行数 

NF相对于当前读取的文件来说所处理的字符数 

4.awk处理机制 

 行前处理BEGIN{}   

逐行处理,{}  

行后处理END{}  

上述编辑指令段可以包含在一对单引号内 

awk [选项] ‘BEGIN{编辑命令}{编辑命令}END{编辑命令}’文件 

5.awk阶段小练习 

(1)利用awk提取本机的IP地址 

基本思路 提取IP地址 结合grep获得包含IP地址的那一行 再结合awk

(2)利用awk提取本机的根分区使用率 

基本思路 通过df命令查看根分区的使用情况 输出上述结果中所需要的内容

6.awk条件示例 

正则表达式 

- /正则表达式/ 

- ~匹配 ~不匹配

数值/字符串比较 

- == 等于 =不等于 

- > 大于   >=大于或的等于 

- < 小于   <=小于或等于 

7.awk条件示例 数值比较 练习

测试文件passwd.txt 

输出奇数行的用户记录 

输出偶数行的用户记录 

输出前三行文本 

输出从第五行开始到文件末尾的所有行 

输出用户名为‘sync’的行

8.awk条件示例  多个条件的组合 

逻辑比较 

- &&逻辑与期望多个条件都成立 

- ||逻辑或只要有一个条件成立即满足条件

练习

测试文件 passwd.txt 

输出第3~5行文本 

输出第3行和第五行文本 

输出UID小于3或者UID是偶数的用户记录

数学运算 

-  +-*/,% 

-  ++,--,+=,-=,*=,/= 

awk条件示例 数学运算 练习

1.输出/etc/hosts影射文件内以127或者129开头的记录 

2.列出100以内整数中7的倍数或者是含7的数用awk来实现  

四.数组

五.diff命令 

diff命令是用来比较两个文件或目录的不同 

diff  [options]  target1 target2 

diff file1 file2 

diff direcory1 directory2

diff中常用的参数 

-b或--ignore-space-change  不检查空格字符的不同 

-B或--ignore-blank-lines  不检查空白行 

-c  显示全部内文并标出不同之处 

-i或--ignore-case  不检查大小写的不同 

-p若比较的文件为C语言的程序码文件时显示差异所在的函数名称 

-q或--brief仅显示有无差异不显示详细的信息 

-r或--recursive比较子目录中的文件

-u 以合并的方式来显示文件内容的不同 

echo `hostname`>file1 

echo `hostname`>file2 

echo 123 >>file2 

diff –c file1 file2 

diff  -r file1 file2 

diff  -u file1 file2 

六.Pacth命令 

用于文件不同文件打布丁 

patch [options] file.old file.path

1.Patch命令常用参数 

-b或者-backup 备份每一个原始文件 

-c或者-context 把修补数据解译成关联性的差异 

-p 指定目录级别从路径全称重除去基层目录     

-p 0 使用完整路径名 –p1 除去前导斜杠 –p 4除去前导斜杠和前三个目录 

-d 设置工作目录 

-E 若修补过后输出的文件内容是一片空白则移除该文件 

2.补丁的产生和使用 

创建两个有差异的文件 westos1 westos2 

生成补丁  diff –u westos1 westos > westos3.path 

查看生成的补丁 diff –c  /diff –u /diff –r /diff -q 

用补丁恢复westos1(并保留原始westos1文件)  

patch –b westos1 westos3.path

七.cut命令 

cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出        

cut  [-bn] [file] 或 cut [-c] [file]  或  cut [-df] [file] 

如果不指定 File 参数cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一 

1.cut命常用参数 

-b 以字节为单位进行分割。这些字节位置将忽略多字节字符边界除非也指定了 

-n 标志。(字节bytes)

-c 以字符为单位进行分割。(字符characters)

-d 自定义分隔符默认为制表符。

-f 与-d一起使用指定显示哪个区域。(域fields) 

为什么会有“域”的提取呢因为b和-c只能在固定格式的文档中提取信息而对于非固定格式的信息则束手无策。这时候“域”就派上用场了 

2.cut命令操作示例 

filename|cut -b 3           //提取每一行的第三个字节 

filename|cut -b 3-5,8    //提取第三第四第八个字节 

有一点要注意cut命令如果使用了-b选项那么执行此命令时cut会先把-b后面所有的定位进行从小到大排序然后再提取。可不能颠倒定位的顺序哦 

filename|cut -b 8,3-5 

filename|cut -b -3      //表示从第一个字节到第三个字节 

filename|cut -b 3-      //表示从第三个字节到行尾        两种都包含第三个字节 

filename|cut -c 3-5,8      //-c 和-b 在此时得到的结果一样的但换成中文就不一样了试一试吧~ cat /etc/passwd|head -n 5|cut -d : -f 1 

cat /etc/passwd|head -n 5|cut -d : -f 1,3-5 

cat /etc/passwd|head -n 5|cut -d : -f 1,3-5,7 

cat / etc/passwd|head -n 5|cut -d : -f -2

八.sort命令 

sort 命令对 File 参数指定的文件中的行排序并将结果写到标准输出。如果 File 参数指定多个文件那么 sort 命令将这些文件连接起来并当作一个文件进行排序                           

sort [-fbMnrtuk] [file or stdin]

1.sort命令常用参数 

-f 忽略大小写的差异  

-b 忽略最前面的空格符部分 

-M 以月份的名字来排序例如 JAN, DEC 等等的排序方法 

-n 使用『纯数字』进行排序(默认是以文字型态来排序的)  

-r 反向排序 

-u 就是 uniq 相同的数据中仅出现一行代表 

-t 分隔符默认是用 [tab] 键来分隔 

-k 以那个区间 (field) 来进行排序的意思 

2.sort命令操作示例 

cat /etc/passwd | sort            //对/etc/passwd 的账号进行排序 

sort 是默认以第一个数据来排序而且默认是以字符串形式来排序 

cat /etc/passwd | sort -t ':' -k 3   //以 : 来分隔的以第三栏来排序 

cat /etc/passwd | sort -t ':' -k 3n  //默认是以字符串来排序的如果想要使用数字排序 

cat /etc/passwd | sort -t ':' -k 3nr  //默认是升序排序如果要倒序排序

按首字母排序

按第三列数字排序,数字排序要加n

去除重复排序

排序导入文件

九.uniq命令 

uniq命令可以去除排序过的文件中的重复行因此uniq经常和sort合用。也就是说为了使uniq起作用所有的重复行必须是相邻的                      

uniq [-icu] 

1.uniq命令常用参数 

-i 忽略大小写字符的不同 

-c 进行计数  

-u 只显示唯一的行 

2.uniq命令操作示例 

cat testfile     hello world friend hello world hello 

uniq testfile     直接删除未经排序的文件将会发现没有任何行被删除

sort testfile | uniq –c     排序之后删除了重复行同时在行首位置输出该行重复的次数 

sort testfile | uniq –dc   仅显示存在重复的行并在行首显示该行重复的次数 

sort testfile | uniq –u     仅显示不重复的行 

3.练习:统计指定文件中的词各有多少个的脚本

十.echo命令 

linux的echo命令, 在shell编程中极为常用, 在终端下打印变量value的时候也是常常用到的, echo命令的功能是在显示器上显示一段文字一般起到一个提示的作用                                      

echo [ -n ] 字符串 

在Linux中echo命令用来在标准输出上显示一段字符比如echo “welcome to westos!" 

这个就会输出“welcome to westos!”这一行文字  

echo “welcome to westos!”>a.sh这个就会在a.sh文件中输出“welcome to westos!”这一行文字

1.echo命令常用参数 

-n 不要在最后自动换行  

-e 打开反斜杠ESC转义 

若字符串中出现以下字符则特别加以处理而不会将它当成一般文字输出           

\a 发出警告声           

\b 删除前一个字符           

\c 最后不加上换行符号           

\f 换行但光标仍旧停留在原来的位置          

\n 换行且光标移至行首           

\r 光标移至行首但不换行           

\t 插入tab           

\v 与\f相同           

\\ 插入\字符           

\nnn 插入nnn八进制所代表的ASCII字符

2.echo输出颜色文本 

shell脚本中echo显示内容带颜色显示,echo显示带颜色需要使用参数-e 格式如下echo -e "\033[41;36m something here \033[0m"  其中41的位置代表底色 36的位置是代表字的颜色  注意   

1、字背景颜色和文字颜色之间是英文的""   

2、文字颜色后面有个m   

3、字符串前后可以没有空格如果有的话输出也是同样有空格   

下面是相应的字和背景颜色可以自己来尝试找出不同颜色搭配 

 例子            

echo -e “\033[31m 红色字 \033[0m”  

echo -e “\033[34m 黄色字 \033[0m”  

echo -e “\033[41;33m 红底黄字 \033[0m”  

echo -e “\033[41;37m 红底白字 \033[0m”

字颜色30—–37  

echo -e “\033[30m 黑色字 \033[0m”    

echo -e “\033[31m 红色字 \033[0m”    

echo -e “\033[32m 绿色字 \033[0m”    

echo -e “\033[33m 黄色字 \033[0m”    

echo -e “\033[34m 蓝色字 \033[0m”    

echo -e “\033[35m 紫色字 \033[0m”    

echo -e “\033[36m 天蓝字 \033[0m”    

echo -e “\033[37m 白色字 \033[0m”  

字背景颜色范围40—–47  

echo -e “\033[40;37m 黑底白字 \033[0m”    

echo -e “\033[41;37m 红底白字 \033[0m”    

echo -e “\033[42;37m 绿底白字 \033[0m”    

echo -e “\033[43;37m 黄底白字 \033[0m”    

echo -e “\033[44;37m 蓝底白字 \033[0m”    

echo -e “\033[45;37m 紫底白字 \033[0m”    

echo -e “\033[46;37m 天蓝底白字 \033[0m”    

echo -e “\033[47;30m 白底黑字 \033[0m”

最后面控制选项说明  

\33[0m 关闭所有属性    

\33[1m 设置高亮度    

\33[4m 下划线    

\33[5m 闪烁    

\33[7m 反显    

\33[8m 消隐    

\33[30m — \33[37m 设置前景色    

\33[40m — \33[47m 设置背景色

最后面控制选项说明   

\33[nA 光标上移n行  

\33[nB 光标下移n行   

\33[nC 光标右移n行   

\33[nD 光标左移n行   

\33[y;xH设置光标位置    

\33[2J 清屏   

\33[K 清除从光标到行尾的内容    

\33[s 保存光标位置    

\33[u 恢复光标位置    

\33[?25l 隐藏光标   

\33[?25h 显示光标

      本文转自一百个小排 51CTO博客,原文链接:http://blog.51cto.com/anfishr/1981827,如需转载请自行联系原作者

你可能感兴趣的文章
国内首款FPGA云服务器,性能是通用CPU服务器30倍以上
查看>>
快捷之道:轻松地使用 DispatchTime
查看>>
从进程说起:容器到底是怎么一回事儿?
查看>>
程序员,不要急于学习编程语言,先学会如何解决问题
查看>>
MongoDB Mobile Sync for iOS推出Beta版本
查看>>
Github工程师为MySQL高可用性采用了新架构
查看>>
OCaml已经做好iOS开发准备
查看>>
马化腾演讲、张勇内部讲话暴露两大巨头云上端倪
查看>>
Java Champions获得免费IntelliJ IDEA许可证
查看>>
单集群10万节点 走进腾讯云分布式调度系统VStation
查看>>
微软一顿操作猛如虎,PowerShell排名直线上升
查看>>
[有奖征集]我有问题问大咖:6位顶级专家聚首,共话云端融合进阶
查看>>
测试驱动开发与行为驱动开发中的测试先行方法
查看>>
微软发布Azure Service Fabric Mesh公开预览版
查看>>
requests proxy & SSL 证书设置
查看>>
微信页面监听摇一摇事件,并伴有音效
查看>>
使用Lisview多布局时报数组越界 异常java.lang.ArrayIndexOutOfBoundsException
查看>>
video.js 源码分析(JavaScript)
查看>>
大段文本的多个关键字高亮
查看>>
JS实现时钟效果
查看>>