Linux的shell脚本grep、sed、awk练习和diff、patch、cut、sort介绍

简介:

一.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 则不需.

a02c23a346fc13f887a5b38c5a99bf1e.png


3.grep+基本正则表达式 
基本正则表达式字符匹配:

.   匹配任意单个字符 

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

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

[[:digit:]]所有数字 

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

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

[[:alpha:]]所有字符 

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

[[:space:]]所有空格 


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

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

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

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

df1eb70cc8584d82551086c5b14e2377.png


基本正则表达式位置绑定 

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

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

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

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





精确匹配

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

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

0a2b3e42d3ace5f7f27f93bb6b65cfd3.png

acef4641b23f8d0eb2a1466b3a0d50b5.png


基本正则表达分组:
\(\):将一个或者多个字符绑定在一起当做一个整体进行处理



二.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:在原文件处操作 

ec9d9503e9abab1c7a6f21313ac11d94.png

5432b529fecf9d6de649a6532e59414b.png



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### (不仅仅限于/) 


删除结尾:

b576eca4ab91b7e9e00885e169b7ea86.png


删除空格:

3d751d1513842cba6f0bad6f8d937524.png


删除1到4行

03100670bb084a72caafa51afe03296b.png


追加字符

6a8ae064944f90a80264e64085843593.png


找出UUID开头保存到test

ca9bd662c3acdbab54c0a94d3601dd97.png


将issue文件加到第六行

4a6d79005b19d52a61a347c8f6ff0b21.png


执行脚本

d51a59a4aaf8ead6ffc47c95c2f7d431.png


将开头#变为/

55eae1ec2814b636a9a88f04cfaed51c.png


空行

abfa49a055acc0127ee6715d0e9e2f89.png

删除多余的空格

a010737f29d1b7d61851bad6fc6bf65c.png


加序号

e8d64c57b7e39630ce40612453fdf3c5.png


三.awk文本报告生成器 

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

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

d79dd62d09f616c8f65d342f63110570.png

2.awk常用命令 

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

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

-v:调用外部shell变量 


7519d3ae8a531f67e3c111fa7515cffb.png



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

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

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

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

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


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

26568f4fd4cd8adc2750b960deaf6826.png


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

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

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


e57757fe738f2d5eb759d798d925232a.png

949d655516485896b2b7b247c1f8c046.png


4.awk处理机制 

 行前处理BEGIN{}   

逐行处理,{}  

行后处理END{}  

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

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

bb57c42959190b7022e1ae12ac10f580.png


5.awk阶段小练习 

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

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

1a6ccf364b67291a75c0e285c21d64ea.png


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

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

97f5301aeca1ac39fb3c52bdb3686a7f.png


6.awk条件示例 

正则表达式 

- /正则表达式/ 

- ~匹配 ~不匹配

01f1b686a9ccbb8de38dd42f46e6944c.png


数值/字符串比较 

- == 等于 =不等于 

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

- < 小于   <=小于或等于 


1b38e0df7c531ba5436c22ca53790af8.png

6e659d7ad841dc9ca3443cf5a0f6ea5f.png

fa02005dfc017fd5f7d6b7bf940139d9.png

223a8c5dda9d754ba6c91184ab715fcb.png


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

测试文件passwd.txt 

输出奇数行的用户记录 

输出偶数行的用户记录 

输出前三行文本 

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

输出用户名为‘sync’的行

b2ef151c8e6874afa39451350bc0db8e.png

760b62dc08ae0c7f17a5bf0a5de36e3c.png

915228ac349b19162167d256988c0e02.png

882b3797bf4805f051735e698fcd976e.png

702ac5fcbb8e48b234403dd0754bdec8.png


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

逻辑比较 

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

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

4fd782fef2d361fd5b4108478573e39d.png

8f628c74b875e069008de0deddafbc76.png



练习

测试文件 passwd.txt 

输出第3~5行文本 

输出第3行和第五行文本 

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

d736ea15fe65cf1e8657bb72c078a664.png

b35d558c5c4bdb41c84b8d15ec4de5bf.png

86a5423d97ba621235e9f9eec273d792.png


数学运算 

-  +-*/,% 

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


awk条件示例 数学运算 练习

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

a2ac80e02c8aa4f9bf6661250c4c9c18.png


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


四.数组



五.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只能在固定格式的文档中提取信息而对于非固定格式的信息则束手无策。这时候“域”就派上用场了 

655df6ff13fa92e2273ad51de0c96ce7.png


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

301432060a65ecf82a3703a868c80ff0.png


八.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  //默认是升序排序如果要倒序排序


按首字母排序

5798d5ab9d4cfd176698f8542aed0043.png


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

5dd7981286db5b05558587cbedf7ad13.png


去除重复排序

93288cad353970ffe94856d65efd54e2.png


排序导入文件

dbd6c27103d914e7f1165ca9c29816c2.png



九.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     仅显示不重复的行 

fe7f18adf92c98bb1b9c6a678e003a01.png


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

273482918c76bc46999e9a2e0427effb.png


十.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,如需转载请自行联系原作者




相关文章
|
1天前
|
Shell Linux C语言
|
13天前
|
Shell Linux
Linux Shell 脚本入门教程:开启你的自动化之旅
Shell是一种计算机程序,它充当了用户与操作系统之间的接口。在Linux系统中,Shell允许用户通过命令行界面(CLI)来控制计算机。Shell脚本则是一种使用Shell语言编写的脚本,它可以自动执行一系列的命令,帮助用户实现任务自动化,提高工作效率。
|
7天前
|
Java Shell Linux
【Linux】手把手教你做一个简易shell(命令行解释器)
【Linux】手把手教你做一个简易shell(命令行解释器)
8 0
|
15天前
|
Shell Linux
Linux环境变量之shell中export定义全局变量和echo 变量的区别
Linux环境变量之shell中export定义全局变量和echo 变量的区别
|
7月前
|
存储 Shell Perl
shell脚本三剑客之sed
shell脚本三剑客之sed
48 2
|
1月前
|
Shell Linux Perl
Linux shell脚本sed使用
Linux shell脚本sed使用
23 1
|
Shell Perl
shell脚本之sed命令
1、概述 2、工作流程 3、命令格式 4、具体操作
shell脚本之sed命令