|
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结尾的单词的行
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 |
|
|