1.查看shell的版本
/bin/bash --version
2.输出重定向
> >>
例如: ls -l >output.txt
把ls -l的结果输出到output.txt 文件中。不在屏幕(标准输出)上输出。
上面的例子通过>操作符把标准输出重定向到一个文件。在默认情况下,如果该文件已经存在,它的内容将被覆盖。
你可以用>>操作符将输出内容附加到一个文件的结尾,而不是覆盖文件。
例如: ls -l >>output.txt
文件描述符0代表一个程序的标准输入,文件描述符1代表标准输出,而文件描述符2代表标准错误输出.
如果想对标准错误输出进行重定向,你需要把想要重定向的文件描述符编号加在>操作符的前面。因为标准错误输出的文件描述符编号是2,所以使用2>操作符。当需要丢弃错误信息并阻止它显示在屏幕上时,这个方法很有用。其他两个标准输出类似。
例如: ls -l 2>output.txt 一般ls -l这条语句不会输出错误,所以output.txt也就没有内容。
3.管道
管道的用法很简单,但是非常有用,也经常用
例如: ls -l | sort | more
这条命令是把ls 的结果经过sort命令排列再经过more输出显示。其中的 | 就是管道命令。在各种命令中起到数据流传递的作用。它可以结合重定向输出来使用,如: ps | sort >output.txt
4.shell通配符
[^a]允许匹配方括号中任何一个单个字符, { } 允许你将任意的字符串组放在一个集合中。
例如: ls my{file,dir} 就会列出 myfile,mydir 文件。 如果是目录就会列出目录的内容,它使用shell来检查当前目录下的每个文件
5.chmod
用来改变文件的模式,也就是权限。例如 chmod +x my.sh 给了my.sh执行的权限。用man chmod 查看更多用法
6.切换目录
cd 例如: cd /home/fantasylf/study 打开/home/fantasylf/study目录
cd ~ 回到主目录
cd ..回到上级目录
pwd 显示当前目录
6.test命令
例如:if test -f output.txt
then
echo yes
fi
如果output.txt文件存在且为普通文件则test语句为真,就会输出yes
test的各项参数如下:
文件条件测试 | 结果 |
-d file | 如果文件是一个目录则结果为真 |
-e file | 如果文件存在则结果为真。要注意 的是,历史上 -e 选项不可移植, 所以通常使用的是 -f 选项 |
-f file | 如果文件是一个普通文件则结果为真 |
-g file | 如果文件的 set-group-id 位被设置则结果为真 |
-r file | 如果文件可读则结果为真 |
-s file | 如果文件的大小不为 0 则结果为真 |
-u file | 如果文件的 set-user-id 位被设置则结果为真 |
-w file | 如果文件可写则结果为真 |
-x file | 如果文件可执行则结果为真 |
7. export命令
export命令将作为它参数的变量导出到子shell中,并使之在子shell中有效。在默认情况下,在一个shell中被创建的变量在这个shell 调用的下级(子)shell中是不可用的。export命令把自己的参数创建为一个环境变量,而这个环境变量可以被当前程序调用的其他脚本和程序看见。从 技术的角度来说,被导出的变量构成从该shell衍生的任何子进程的环境变量。
8.find命令
这是个用于搜索文件的命令,它极其有用,但Linux初学者常常觉得它不易使用,这不仅仅是因为它有选项、测试和动作类型的参数,还因为其中一个参数的处理结果可能会影响到后续参数的处理。了确保你具有搜索整个机器的权限,请以root用户身份来执行这个命令:
例如: find / -name test -print
这个命令的含义是:从根目录开始查找名为test的文件,并且输出该文件的完整路径。
如果指定它不查找某个范围。可以这样用: find / -mount -name test -print 就可以告诉find命令不要搜索挂载的其他文件系统的目录。
find命令的完整语法格式如下所示: find [ path ] [ option ] [ tests ] [ actions ]
path部分很容易理解:你既可以使用绝对路径,如/bin,也可以使用相对路径,如.。如果需要,你也可以指定多个路径,如find /var /home。
find命令有许多选项可用,表2-12列出了一些主要的选项。
表 2-12
选项 | 含义 |
-depth | 在查看目录本身之前 先搜索目录的内容 |
-follow | 跟随符号链接 |
-maxdepths N | 最多搜索 N 层目录 |
-mount( 或 -xdev) | 不搜索其他文件系统中的目录 |
下面是测试部分。可以提供给find命令的测试非常多,每种测试返回的结果有两种可能:true或false。find命令开始工作时,它按照顺序 将定义的每种测试依次应用到它搜索到的每个文件上。如果一个测试返回false,find命令就停止处理它当前找到的这个文件,并继续搜索。如果一个测试 返回true,find命令将继续下一个测试或对当前文件采取行动。表2-13只列出了最常用的测试,请参考find命令的手册页以了解所有可以使用的测 试。
表 2-13
测试 | 含义 |
-atime N | 文件在 N 天之前被最后访问过 |
-mtime N | 文件在 N 天之前被最后修改过 |
-name pattern | 文件名(不包括路径名) 匹配提供的模式 pattern , 为了确保 pattern 被传递给 find 命令而不是由 shell 来处理, pattern 必须总是用引号括起 |
-newer otherfile | 文件比 otherfile 文件要新 |
-type c | 文件的类型为 c , c 是一个特殊类 型。最常见的是 d (目录)和 f (普通文件 )。 其他可用的类 型请参考手册页 |
-user username | 文件的拥有者是指定的用户 username |
你还可以用操作符来组合测试。大多数操作符有两种格式:短格式和长格式,如表2-14所示。
表 2-14
操作符,短格式 | 操作符, 长格式 | 含义 |
! | -not | 测试取反 |
-a | -and | 两个测试都必须为真 |
-o | -or | 两个测试有一个必须为真 |
表2-15只列出了最常见的动作,完整的动作列表请见find命令的手册页。
-exec和-ok命令将命令行上后续的参数作为它们参数的一部分,直到被/;序列终止。实际上,-exec和-ok命令执行的是一个嵌入式命令, 所以嵌入式命令必须以一个转义的分号结束,使得find命令可以决定什么时候它可以继续查找用于它自己的命令行选项。魔术字符串{}是-exec或-ok 命令的一个特殊类型的参数,它将被当前文件的完整路径取代。
表 2-15
动作 | 含义 |
-exec command | 执行一条命令。这是最常见的 动作之一。请见这个表格之 后的解释以了解参数是如何传 递给这个命令的。 这个动作必 须使用 /; 字符对来结束 |
-ok command | 与 -exec 类似,但它在执行命令 之前会针对每个要处理的文件, 提示用户进行确认。 这个动作 必须使用 /; 字符对来结束 |
| 打印文件名 |
-ls | 对当前文件使用命令 ls–dils |
find命令是非常强大的,一两句话是说不清楚。要深入了解就用man 或info解决吧。
9.grep命令
我们将介绍的第二个非常有用的命令是grep,这个不寻常的名字代表的是通用正则表达式解析器(General Regular Expression Parser,简写为grep)。你使用find命令在系统中搜索文件,而使用grep命令在文件中搜索字符串。事实上,一种非常常见的用法是在使用 find命令时,将grep作为传递给-exec的一条命令。
grep命令使用一个选项、一个要匹配的模式和要搜索的文件,它的语法如下所示:
grep [ option ] PATTERN [ FILES]
如果没有提供文件名,则grep命令将搜索标准输入。
我们首先来查看grep命令的一些主要选项,它们列在了表2-16中,完整的选项列表请见grep命令的手册页。
表 2-16
选项 | 含义 |
-c | 输出匹配行的数目,而不是 输出匹配的行 |
-E | 启用扩展表达式 |
-h | 取消每个输出行的普通前缀, 即匹配查询模式的文件名 |
-i | 忽略大小写 |
-l | 只列出包含匹配行的文件名, 而不输出真正的匹配行 |
-v | 对匹配模式取反,即搜索 不匹配行而不是匹配行 |
例如:
grep my word.txt
它只是在文件words.txt中搜索字符串my,然后输出匹配的行。文件名未输出是因为你只在一个文件中进行搜索。
grep my word.txt word2.txt
输出匹配的行和对应的文件名。
现在是时候介绍正则表达式的基础知识了,它允许你实现更复杂的匹配。正如我们在本章前面提到的那样,正则表达式被广泛应用于Linux和许多其他开源编程语言中。你可以在vi编辑器或Perl脚本中使用它们,而且不论它们出现在哪里,其基本原理都是一样的。
在正则表达式的使用过程中,一些字符是以特定方式处理的。最常使用的特殊字符如表2-17所示。
表 2-17
字符 | 含义 |
^ | 指向一行的开头 |
$ | 指向一行的结尾 |
. | 任意单个字符 |
[] | 方括号内包含一个字符范围,其中任 何一个字符都可以被匹配,例如字符 范围 a ~ e ,或在字符范围前面加上 ^ 符 号表示使用反向字符范围,即不匹 配指定范围内的字符 |
如果想将上述字符用作普通字符,就需要在它们前面加上/字符。例如,如果想使用$字符,你需要将它写为/$。
在方括号中还可以使用一些有用的特殊匹配模式,如表2-18所示。
表 2-18
匹配模式 | 含义 |
[:alnum:] | 字母与数字字符 |
[:alpha:] | 字母 |
[:ascii:] | ASCII 字符 |
[:blank:] | 空格或制表符 |
[:cntrl:] | ASCII 控制字符 |
[:digit:] | 数字 |
[:graph:] | 非控制、非空格字符 |
(续)
匹配模式 | 含义 |
[:lower:] | 小写字母 |
[:print:] | 可打印字符 |
[:punct:] | 标点符号字符 |
[:space:] | 空白字符 , 包括垂直制表符 |
[:upper:] | 大写字母 |
[:xdigit:] | 十六进制数字 |
另外,如果指定了用于扩展匹配的-E选项,那些用于控制匹配完成的其他字符可能会遵循正则表达式的规则(见表2-19)。对于grep命令来说,我们还需要在这些字符之前加上/字符。
表 2-19
选项 | 含义 |
? | 匹配是可选的,但最多匹配一次 |
* | 必须匹配 0 次或多次 |
+ | 必须匹配 1 次或多次 |
{n} | 必须匹配 n 次 |
{n,} | 必须匹配 n 次或 n 次以上 |
{n,m} | 匹配次数在 n 到 m 之间,包括 n 和 m |
这看上去有点复杂,但如果你实际应用它,将会发现它并不像第一眼看上去那么复杂。掌握正则表达式的最简单方法就是尝试一些实验。