Shell高级
一. shell置换和引用
1.什么是置换和引用
在shell中具有很多特殊意义的字符(*、?、\等),shell将包含元字符的字符串根据其意义转换成新字符串的过程称为置换;关闭shell对特殊字符含义的解析处理被称为引用。
2.Shell置换的类型
(1) 文件名置换
l 元字符
-* 匹配所有字符
-? 匹配所有单个字符
-[] 匹配括弧内的字符
-[!] 匹配除括弧内的其他字符
l 实例
-#ls abc*
-#ls ?abc
-#ls [abc]*
-#ls [!a]*
(2) 变量置换
l $varname和${varname} 置换变量的值,引用指定变量名的值
l ${varname:+value} 判断varname变量是否设置,如果设置了,则显示value,否则显示空
l ${varname:?value} 如果变量varname变量未设置/为空,则显示错误信息value
l ${varname:-value} 如果变量varname变量未设置/为空,则显示value
l ${varname:=value} 如果变量varname变量未设置/为穿,则显示value,并将value值赋给varname变量
(3) 命令置换
l 使用`命令`,置换命令的结果。如cat `ls /etc/grub.conf`
l 使用$(命令)方式置换命令的结果。如cat $(ls /etc/grub.conf)
(4) 运算式置换
l 使用$((算术表达式))置换表达式的结果。如a=$( (1 + 1 ))
l 使用declare/let定义整型变量和给变量赋值。如let a=5+5
3.Shell引用
l 使用“\”取消其后面的特殊字符的含义,特殊字符有* ? [] ‘ ’ “ ” \ $ ; & ( ) | ^ ! #;如“abc\*”.
l 使用‘’引用所有被括起来的字符,如echo ‘$a*’
l 使用“”引用所有除$和`以外的字符
二. 文本过滤
1.什么是文本过滤
文本过滤指的是提取指定文件中的部分内容或替换指定文本文件中的字符串
2.文本过滤的命令
(1) head
功能:输出文件头部n行
格式:head -n 文件名
实例:#head -3 /etc/passwd
(2) tail
功能:输出文件尾部n行或监控文件
格式:tail +n/-n/-f 文件
实例:#tail –3 /etc/passwd
#tail +3 /etc/passwd
#tail –f /etc/passwd
(3) uniq
功能: 检查及删除文本文件中重复出现的行列
格式: uniq [选项] [输入文件][输出文件]
选项:
-c 在每列旁边显示该行重复出现的次数。
-d 仅显示重复出现的行列。
-f 忽略比较指定的栏位。
-s 忽略比较指定的字符。
-u 仅显示出现一次的行。
-w<字符位置> 指定要比较的字符。
实例:
#uniq -u /root/aa
#uniq -dc /root/aa
(4) sort
功能:对文件进行排序/合并
格式:sort [选项] 文件名
选项:
-d:按字典顺序(只对空格/字母/数字)
-f:忽略大小写
-t:指定分隔符
-r反向
-n按数字大小显示
-c只检查是否有序,不实际排序
-u消除重复行
实例:
#sort -r /etc/passwd
#sort +1-2 /etc/passwd
(5) grep
功能:在文本文件中查找匹配的字符串
格式:#grep [参数] “字符串” 文件
参数:
-? 同时显示匹配行上下的?行
-b 在匹配行前面打印该行所在的块号
-c 只打印匹配的行数,不显示匹配的内容
-f File 从文件中提取模板,空文件中包含0个模板,所以什么都不匹配
-h 当搜索多个文件时,不显示匹配文件名前缀
-I 忽略大小写差别
-q 取消显示,只返回退出状态。0则表示找到了匹配的行
-l 打印匹配模板的文件清单
-L 打印不匹配模板的文件清单
-n 在匹配的行前面打印行号
-s 不显示关于不存在或者无法读取文件的错误信息
-v 反检索,只显示不匹配的行
-w 如果被\<和\>引用,就把表达式做为一个单词搜索
正则表达式元字符:
^
锚定行的开始 如:'^grep'匹配所有以grep开头的行
$
锚定行的结束 如:'grep$'匹配所有以grep结尾的行
.
匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p
*
匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。.*一起用代表任意字符
[]
匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep
[^]
匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行
\(..\)
标记匹配字符,如'\(love\)',love被标记为1
\<
锚定单词的开始,如:'\
\>
锚定单词的结束,如:'grep\>'匹配包含以grep结尾的单词的行
x\{m\}
重复字符x,m次,如:'0\{5\}'匹配包含5个o的行
x\{m,\}
重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行
x\{m,n\}
重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行
实例:
# ls -l | grep '^a'
通过管道过滤ls-l输出的内容,只显示以a开头的行。
# grep 'test' d*
显示所有以d开头的文件中包含test的行。
# grep 'test' aa bbcc
显示在aa,bb,cc文件中匹配test的行。
# grep '[a-z]\{5\}'aa
显示所有包含每个字符串有5个连续小写字符的字符串的行。
# grep 'w\(es\)t.*\1'aa
如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后面紧跟着另外一个es(\1),找到就显示该行。如果用egrep或grep -E,就不用"\"号进行转义,直接写成'w(es)t.*\1'就可以了。
(6) sed
功能:Sed(a stream editor)是流线型、非交互式编辑器。它允许你执行与vi编辑器里一样的编辑任务。Sed 程序不是与编辑器交互式工作的,而是让你在命令行里敲入编辑的命令,给文件命名,然后在屏幕上查看命令输出结果。
格式:sed [选项] sed子命令 输入文件 [输出文件]
子命令:
p 打印匹配行
= 显示文件行号
a \ 在定位行号后附加新文本信息
i \ 在定位行号前插入新文本信息
d 删除定位行
c \ 用新文本替换定位文本
s 使用替换模式替换相应模式
r 从另一个文件中读文本
w 写文本到一个文件
q 第一个模式匹配完成后推出或立即推出
{ } 在定位行执行的命令组
n 从另一个文件中读文本下一行,并附加在下一行
y 传送字符
n 延续到下一输入行;允许跨行的模式匹配语句
实例:
1> 打印:p命令
#sed '/north/p'datafile
默认输出所有行,找到north的行重复打印
#sed –n '/north/p'datafile
禁止默认输出,只打印找到north的行
#sed -n'/west/,/east/p' datafile
打印在west和east之间的模式范围内所有行。
2> 删除:d命令
#sed '3d' datafile
删除第三行,其余行输出到屏幕
#sed '3,$d' datafile
从第3行到最后一行都删除,将剩余部分输出到屏幕
#sed '/north/d'datafile
将含有north的行删除,其余输出到屏幕
3> 替换:s命令
#sed 's/west/north/g'datafile
找到datafile中的所有west并替换成north,将替换后的内容输出到屏幕。
#sed -n's/Hemenway/Jones/gp' datafile
所有的Hemenway所在的位置都用Jones来取代,而且只有改变的行被打印。
#sed -n's/\(Mar\)got/\1ianne/p' datafile
模式Mar被封装在括弧里且在一个专用寄存器里存为标记1。在替换串里它将被引用做\1。然后用Marianne替代Margot。
4> 多次编辑 -e 选项
#sed -e '1,3d' -e's/Hemenway/Jones/' datafile
5> 从文件中读取:r命令
#sed '/Suan/rnewfile' datafile
r命令从newfile中读取内容,将内容输出到Suan的后面。
6> 写入文件:w命令
#sed -n '/north/wnewfile' datafile
w命令把指定的行写入到一个文件。
7> 添加:a命令
#sed '/north/a\ THENORTH SALES DISTRICT HAS MOVED<-----' datafile
奇怪的是a\后面必须另起一行,在输入要添加的内容,否则会提示解析错误。
8> 插入:i命令
# sed '/north/i\ THENORTH SALES DISTRICT HAS MOVED' datafile
在符合模式的行前面插入内容。其余和a\命令相同。
9>下一个:n命令
#sed'/eastern/{n;s/AM/Archie/;}' datafile
10>变换:y 命令
#sed'1,3y/abcdefghijklmnopqrst/ABCDEFGHIJKLMNOPQRST/' datafile
将对应字母进行转换。
11>退出:q 命令
#sed '5q' datafile
在打印了5行之后,用q命令退出sed程序。
三. Awk
1. 什么是awk
Awk是一种程序语言,对文本文件的处理具有很强的功能,如修改、比较、提取、打印等。awk语言的最基本功能是在文件或字符串中基于指定规则浏览和抽取信息。awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。
2. 如何执行awk程序
Awk程序可以直接在命令行中执行,也可以存放在文件然后在命令行调用。
方法一:直接在命令行中执行
#gawk ‘program’ input-file1 input-file2…
方法二:调用awk程序文件
#gawk –f program-file input-file1 input-file2…
任何a w k语句都由模式和动作组成。在一个a w k脚本中可能有许多语句。模式部分决定动作语句何时触发及触发事件。处理即对数据进行的操作。如果省略模式部分,动作将时刻保持执行状态。模式可以是任何条件语句或复合语句或正则表达式。
模式包括两个特殊字段B E G I N和E N D。使用B E G I N语句设置计数和打印头。B E G I N语句使用在任何文本浏览动作之前,之后文本浏览动作依据输入文件开始执行。E N D语句用来在a w k完成文本浏览动作后打印输出文本总数和结尾状态标志。如果不特别指明模式, a w k总是匹配或打印行数。
实际动作在大括号{ }内指明。动作大多数用来打印,但是还有些更长的代码诸如i f和循环语句及循环退出结构。如果不指明采取动作, a w k将打印出所有浏览出来的记录。
3. 认识文件中的记录和域
域1 分隔符 域2 分隔符 域3 分隔符 域4
abc # 0 2 / 9 9 # 4 8 # fine
l 默认文件中以换行符结束的行称为记录,awk中可以指定记录分隔符,也可以用$0引用整个记录
l 记录是由若干个域构成的,域之间由指定的分隔符隔开,默认分隔符为空格。可以用$1…$n引用记录中的各个域
4. 正则表达式和运行算符
(1) 算术运算符:+ -*、/ %(取余) ^(乘方)
(2) 关系运算符:< > <= >= == != ~(匹配) !~(不匹配)
(3) 逻辑运算符:&& || !
(4) 赋值运算符:= += -= *= /= %= ^=
(5) 自增、自减运算符:++ --
(6) 数组引用:in
5. awk变量和数组
(1)awk变量分为数值型和字符型,用户引用变量时即定义了变量,变量类型由变量内容决定,引用变量时不用加$。
(2)awk内置变量如下
l ARGC 命令行参数的数目。
l ARGIND 命令行中当前文件的位置(从0开始算)。
l ARGV 包含命令行参数的数组。
l CONVFMT 数字转换格式(默认值为%.6g)
l ENVIRON 环境变量关联数组。
l ERRNO 最后一个系统错误的描述。
l FIELDWIDTHS 字段宽度列表(用空格键分隔)。
l FNR 同NR,但相对于当前文件。
l FS字段分隔符(默认是任何空格)。
l IGNORECASE如果为真,则进行忽略大小写的匹配。
l NF当前记录中的字段数。
l NR当前记录数。
l OFMT数字的输出格式(默认值是%.6g)。
l OFS输出字段分隔符(默认值是一个空格)。
l ORS输出记录分隔符(默认值是一个换行符)。
l RLENGTH由match函数所匹配的字符串的长度。
l RS记录分隔符(默认是一个换行符)。
l RSTART由match函数所匹配的字符串的第一个位置。
l SUBSEP 数组下标分隔符(默认值是\034)。
(3)awk数组
awk允许使用数组,数组的格式如下。
Varname[下标]
awk数据组的下标可以数字(从1开始)和字符表示,name[1]、name[a]。
6.awk输出命令
输出命令是awk最常用的操作命令,它包含print和printf两种方式。
(1) print
#awk ‘{print $0}’ /etc/passwd
(2)printf(格式化输出)
格式:printf “输出格式”,表达式
实例:#awk ‘{printf “user name:%s”,%1’} /etc/passwd
注:print和printf语句中常用的转义字符和格式符
-转义字符
l \t table制表位
l \n 换行符
l \\ 表示“\”
l \b 表示退格
-格式符
l %c 输出单个字符
l %d %i 输出整数
l %e 按科学计数法输出小数
l %f 输出浮点数
l %s 输出字符串
l %% 输出%
7.Awk控制语句
(1) if语句
功能:实现条件分支
格式:if (expr) {action1}
else {action2}
实例:#awk -F: ‘{if ($3==0) {print $0}}’ /etc/passwd
(2)for语句
功能:实现循环执行
格式:for (init_cntr;test_cntr;incr_cntr){action}
实例:#awk ‘{for(i=1;i<5;i++) {printf “%s”,$i;printf “:”} print “\n”}’
(3)while语句
功能:实现循环执行
格式:while (expr){action}
实例:#awk ‘{i=1;while(i<5) {printf “%s”,$i;printf “:”} print “\n” }’
注:还有一种do…while形式
(4)break和continue
退出循环和进行下一次循环
(5)exit
退出awk
(6)next
跳过后面内容,读取下一行
8.awk函数
length(string) 求串string中的字符个数
index(search,string) 返回string中search串的位置
match(string,reg) 返回常规表达式reg匹配的string中的位置
sub(reg,string,target) 第一次当常规表达式reg匹配,替换target串中的字符串
substr(string,position,len)返回一个以position开始len个字符的子串
totower(string) 返回string中对应的小写字符
toupper(string) 返回string中对应的大写字符
split(string,store,delim) 根据分界符delim,分解string为store的数组元素
sprintf(format,variable) 返回一个包含基于format的格式化数据,variables是要放到串中的数据
strftime(format,timestamp) 返回一个基于format的日期或者时间串,timestmp是systime()函数返回的时间
srand(x) 初始化随机数发生器。如果忽略x,则使用system()
system() 返回自1970年1月1日以来经过的时间(按秒计算)
rand() 0-1之间的随机数
9.Awk脚本实例
#vi /awk/st1.awk
#!/bin/awk -f
#to call:du|duawk.awk
#prints file/direc's in bytes and blocks
BEGIN{
OFS="\t";
print "name" "\t\t","bytes","blocks\n"
print "==============================="}
{print $2,"\t\t",$1*512,$1}
#chmod a+x/awk/st1.awk
#du|awk/st1.awk
微信扫一扫 、关注公众号
不定时分享资料视频