您的位置:首页 > 运维架构 > Shell

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

2017-11-14 21:21 911 查看
一.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 显示光标
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  grep sed awk diff pa