1.find命令
这个命令用来搜索文件。
例如:# find / -name test –print
解释:从根目录开始查找名为test的文件,并且输出该文件的完整路径。如果Linux机器通过网络挂载了Windows机器的文件系统,那么这条命令还会查找Windows机器的文件系统。这时候可以通过使用-mount选项来禁止搜索挂载其他文件系统的目录。
# find / -mount –name test –print
find命令的完整形式如下:
find [path] [options] [tests] [actions]
path:可以是相对路径,也可以是绝对路径,同时也可以是多个路径(find /var/home)
options:有多个参数可以设置
1)-depth:在查看目录本身之前先搜索目录的内容
2)-follow:跟随符号链接
3)-maxdepths N:最多搜索N层目录
4)-mount或-xdev:不搜索其他文件系统中的目录
tests:可以有多个参数可选
1)-atime N:文件在N天之前被最后访问过
2)-mtime N:文件在N天之前被最后修改过
3)-namepattern:文件名(不包括路径名)匹配模式提供的模式pattern,为了确保pattern被传递给find命令而不是由shell来处理,pattern必须是由引号引起来
4)-newer otherfile:文件比otherfile文件要新
5)-type c:文件的类型为c,c是一个特殊类型。最常见的是d(目录)和f(普通文件)
6)-user username:文件的拥有者是指定的用户username
注意:tests选项还可以通过操作符来组合使用。操作符一般有两种格式:长格式和短格式。
!(-not)
为了能正确的使用操作符,一般需要添加圆括号在操作符的操作对象外侧,但是由于圆括号对于shell来说有着特殊的含义,所以必须使用反斜杠来引用圆括号。
例如:\( -newer X –o –name “_*” \)(注意括号前后是否有空格)
actions:有很多参数可以选择
1)-execcommand:执行一条命令。与ok命令都会将命令行后续的参数作为它们参数的一部分,直到被\;序列终止。魔术字符串{}是这两个命令的一个特殊类型的参数,将会被当前文件的完整路径替代。
2)-okcommand与exec类似,但是它在执行命令之前会针对每个要处理的文件,提示用户进行确认。
3)-print:打印文件名
4)-ls:对当前文件使用命令ls-dils
例如:find . –newer a.c –type f –exec ls –l {} \;
2.grep命令
grep名字的含义是正则表达式解析器。使用find可以再系统中搜索文件,而使用grep命令在文件中搜索字符串。一种常用的做法是在使用find命令时,将grep作为传递给-exec的一条命令。
grep [options] PATTERN [FILES]
FILES:表示文件名
options:grep的选项参数
1)-c:输出匹配行的数目,而不是输出匹配的行
2)-E:启用扩展表达式
3)-h:取消每个输出行的普通前缀,即匹配查询模式的文件名
4)-i:忽略大小写
5)-l:只列出包含匹配行的文件名,而不是输出真正的匹配行
6)-v:对匹配模式取反,即搜索不匹配行
使用举例:
grep in words.txt(在words.txt中搜索in关键字)
grep –c –v in words.txt words2.txt
3.正则表达式
在正则表达式中,一些字符是以特定方式处理的。常用的如下:
(1)^:指向一行的开头
(2)$:指向一行的结尾
(3).:任意单个字符
(4)[]:方括号内包含一个字符范围,其中的任何一个字符都可以被匹配;在字符范围前面加上^符号表示使用方向字符范围,即不匹配指定范围内的字符。如果想把这些字符当做普通字符使用,需要在其前面加上\字符。
方括号内还可以使用一些有用的特殊匹配模式:例如[:digit:](数字)
另外,如果指定了用于扩展匹配的-E选项,那些用于控制匹配完成的其他字符可能会遵循正则表达式的规则。对于grep命令来说,我们还需要在这些字符前面加上\字符。
(1)?:匹配是可选的,但是最多匹配一次
(2)*:必须匹配0次或多次
(3)+:必须匹配1次或多次
(4){n}:必须匹配n次
(5){n,}:必须匹配n次或n次以上
(6){n,m}:匹配次数在n到m之间,包括n和m
grep e$ word2.txt
解释:查找以e字母结尾的行
grep a[[:blank:]] words2.txt
解释:查找以字母a结尾的单词
grep Th.[[:space:]] words2.txt
解释:查找以Th开头的由3个字母组成的单词
grep –E [a-z]\{10\} words2.txt
解释:搜索只有10个字符长的全部由小写字母组成的单词
3.命令的执行
(1)算术扩展
expr可以处理一些简单的算术命令,但是这个命令执行起来相当慢,因为它需要调用一个新的shell来处理expr命令。一种更好的解决方法是使用$((...))扩展,把需要求值的表达式括在$((...))中能够更有效地完成简单的算术运算。
例如:x=1;x=$(($x+1))
注意:这与x=$(...)命令不同,两对圆括号用于算术替换,而一对圆括号用于命令的执行和获取输出。
(2)参数扩展
#!/bin/sh
for i in 1 2
do
my_select_process $i_temp
done
注:$i_temp不能被实时替换为1_temp等,如果要达到效果需要使用${i}_temp形式。
还有多种参数替换方法,常见的如下:
${param:-default}:如果param为空,就把它设置为default的值
${#param }:给出param的长度
${param%word}:从param的尾部开始删除与word匹配的最小部分,然后返回剩余部分
${param%%word}:从param的尾部开始删除与word匹配的最长部分,然后返回剩余部分
${param#word}:从param的头部开始删除与word匹配的最小部分,然后返回剩余部分
${param##word}:从param的头部开始删除与word匹配的最长部分,然后返回剩余部分
例:foo=/usr/local/bin/X11/local/startx;
{foo#*/}:语句仅仅匹配并删除最左边的/(记住,*匹配零个或多个字符)
{foo##*/}:语句匹配并删除尽可能多的字符
{foo%local*}:匹配从右边起直到第一次出现local(及跟在它后面的所有字符)
{foo%%local*}:从右边起尽可能多地匹配字符,直到遇到最左边的local
4.here文档
在shell脚本程序中向一条命令传递输入的一种特殊方式是使用here文档。它允许一条命令在获得输入数据时就好像是在读取一个文件或键盘一样,而实际上是从脚本程序中得到的输入数据。
here文档以两个连续的小于号开始,紧跟着一个特殊的字符序列,该序列在文档的结尾处再次出现。这个特殊字符序列的作用就像一个标记,它告诉shellhere文档结束的位置。
例子:
#!/bin/sh
cat << !FUNKY!
hello
!FUNKY!
输出:hello
here文档的另一个用法
#!/bin/sh
ed text_file <<!FunkyStuff!
3
d
.,\$s/is/was/
w
q
!FunkyStuff!
exit 0
解释:这个脚本程序只是调用ed编辑器并向它传递命令,先让它移动到第三行,然后删除该行,再把当前行(第三行被删除,所以现在的当前行就是以前的第四行)中的is替换为was。在here文档中使用\字符来防止$字符被shell扩展。\字符的作用是对$进行转义,让shell知道不要尝试把$s/is/was扩展为它的值。
5.调试脚本程序
(1)可以通过添加echo语句来输出变量的内容。
(2)可以再调用shell时加上命令行选项,或是使用set命令。
sh –n