在前面,我们已经装好了 CentOS 的虚拟机系统,并且复制了 4 台机器,现在,我们就不直接使用 VMware 直接操作服务器虚拟机了,而是使用 Xshell 软件。官方下载地址:https://www.netsarang.com/zh/xshell/
Xshell 软件是一款客户机软件,通过SSH协议远程访问服务器。以后你们到公司上班的话,是见不到那些物理服务器的,你要访问那些服务器,必须通过你公司的电脑通过网络远程连接,目前比较常用的就是 Xshell 软件。
打开 Xshell,
输入:ssh 主机名@主机IP地址 ,回车,就会让你输入密码:
输入密码,点 确定,即远程连接服务器成功。Xshell界面和VMware界面是一样一样的。
![](https://i-blog.csdnimg.cn/blog_migrate/517a04c829199c04be4e83daf6a8a5e3.png)
VMware界面
![](https://i-blog.csdnimg.cn/blog_migrate/536a32ae99aed8a50cf9465d37fac76e.png)
Xshell界面
接下来进入今天的主题:开始讲 Linux 命令啦
Linux 命令
1、type
type命令 用来显示指定命令的类型,判断给出的指令是内部指令还是外部指令。
2、file
file命令 用于辨识文件类型。通过file指令,我们得以辨识该文件的类型。
3、echo
4、man
如果在使用 man 命令时提示该命令没有安装,就使用 yum install man man-pages 安装 man 命令和其帮助文档 man-pages
5、yum
6、help
总结来说,Linux 就两类命令,
一类是 外部命令,使用 man 来学习
一类是 内部命令,使用 help 来学习
Linux 所有的内部命令 可通过 help 直接回车得到显示:
[root@node0001 ~]# help
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
These shell commands are defined internally. Type `help' to see this list.
Type `help name' to find out more about the function `name'.
Use `info bash' to find out more about the shell in general.
Use `man -k' or `info' to find out more about commands not in this list.
A star (*) next to a name means that the command is disabled.
job_spec [&] history [-c] [-d offset] [n] or hi>
(( expression )) if COMMANDS; then COMMANDS; [ elif>
. filename [arguments] jobs [-lnprs] [jobspec ...] or job>
: kill [-s sigspec | -n signum | -si>
[ arg... ] let arg [arg ...]
[[ expression ]] local [option] name[=value] ...
alias [-p] [name[=value] ... ] logout [n]
bg [job_spec ...] mapfile [-n count] [-O origin] [-s>
bind [-lpvsPVS] [-m keymap] [-f fil> popd [-n] [+N | -N]
break [n] printf [-v var] format [arguments]>
builtin [shell-builtin [arg ...]] pushd [-n] [+N | -N | dir]
caller [expr] pwd [-LP]
case WORD in [PATTERN [| PATTERN]..> read [-ers] [-a array] [-d delim] >
cd [-L|-P] [dir] readarray [-n count] [-O origin] [>
command [-pVv] command [arg ...] readonly [-af] [name[=value] ...] >
compgen [-abcdefgjksuv] [-o option]> return [n]
complete [-abcdefgjksuv] [-pr] [-DE> select NAME [in WORDS ... ;] do CO>
compopt [-o|+o option] [-DE] [name > set [--abefhkmnptuvxBCHP] [-o opti>
continue [n] shift [n]
coproc [NAME] command [redirections> shopt [-pqsu] [-o] [optname ...]
declare [-aAfFilrtux] [-p] [name[=v> source filename [arguments]
dirs [-clpv] [+N] [-N] suspend [-f]
disown [-h] [-ar] [jobspec ...] test [expr]
echo [-neE] [arg ...] time [-p] pipeline
enable [-a] [-dnps] [-f filename] [> times
eval [arg ...] trap [-lp] [[arg] signal_spec ...]>
exec [-cl] [-a name] [command [argu> true
exit [n] type [-afptP] name [name ...]
export [-fn] [name[=value] ...] or > typeset [-aAfFilrtux] [-p] name[=v>
false ulimit [-SHacdefilmnpqrstuvx] [lim>
fc [-e ename] [-lnr] [first] [last]> umask [-p] [-S] [mode]
fg [job_spec] unalias [-a] name [name ...]
for NAME [in WORDS ... ] ; do COMMA> unset [-f] [-v] [name ...]
for (( exp1; exp2; exp3 )); do COMM> until COMMANDS; do COMMANDS; done
function name { COMMANDS ; } or nam> variables - Names and meanings of >
getopts optstring name [arg] wait [id]
hash [-lr] [-p pathname] [-dt] [nam> while COMMANDS; do COMMANDS; done
help [-dms] [pattern ...] { COMMANDS ; }
7、whereis
----------------------- 华丽的分割线 --------------------------------
文件系统命令
1、df
Linux df命令用于显示目前在Linux系统上的文件系统的磁盘使用情况统计。
2、du
Linux du命令用于显示目录或文件的大小。
du会显示指定的目录或文件所占用的磁盘空间。
du == disk usage (磁盘使用量,占用的磁盘空间)
一个文件占用的磁盘空间和一个文件的大小是两码事情。占用空间取决于文件系统的块(block)的大小,linux一般默认是4k(4096) ,因此,一个大小为1个字节的文件,最小也要占用4k,如果你创建文件系统的时候制定块大小是16K,那么即便一个文件只有1个字节,占用空间也是16K。
如果一个分区上主要放大文件,那么block可以大一些,有利于减少磁盘碎片,如果主要放小文件,那么block设置小一下,否则太浪费磁盘空间。
通常情况下,ls 显示的文件大小比du显示的磁盘占用空间小,比如文件系统的block是4K,一个13K的文件占用的空间是 13k/4k = 3.25 个block,一个block只能被一个文件占用,因此实际占用空间就是4个block,就是16K。
3、cd
Linux cd命令用于切换当前工作目录至 dirName(目录参数)。
其中 dirName 表示法可为绝对路径或相对路径。若目录名称省略,则变换至使用者的 home 目录 (也就是刚 login 时所在的目录)。
另外,”~” 也表示为 home 目录 的意思,”.” 则是表示目前所在的目录,”..” 则表示目前目录位置的上一层目录。
语法
cd [dirName]
- dirName:要切换的目标目录。
实例
跳到 /usr/bin/ :
cd /usr/bin/
跳到自己的 home 目录 :
cd ~
或者 cd
跳到目前目录的上上两层 :
cd ../..
跳到上次所在的目录:
cd -
另外,如果当前用户为 root 用户,root 用户可以访问其它任何用户的 家目录,可以通过:
cd /home/ 用户名
另外,还可以通过(波浪线扩展):
cd ~用户名
4、mkdir
Linux mkdir命令用于建立名称为 dirName 之子目录。
语法
mkdir [-p] dirName
参数说明:
- -p 确保目录名称存在,不存在的就建一个。
实例
在工作目录下,建立一个名为 AAA 的子目录 :
mkdir AAA
在工作目录下的 BBB 目录中,建立一个名为 Test 的子目录。 若 BBB 目录原本不存在,则建立一个。(注:本例若不加 -p,且原本 BBB目录不存在,则产生错误。)
mkdir -p BBB/Test
同时创建多个目录,用 {} 括起来即可:
mkdir ./AAA/{1,2,3}
5、rm
Linux rm命令用于删除一个文件或者目录。
语法
rm [options] name...
参数:
- -i 删除前逐一询问确认。
- -f 即使原档案属性设为唯读,亦直接删除,无需逐一确认。
- -r 将目录及以下之档案亦逐一删除。
实例
删除文件可以直接使用rm命令,若删除目录则必须配合选项”-r”,例如:
# rm test.txt rm:
是否删除 一般文件 "test.txt"? y
# rm homework rm:
无法删除目录"homework": 是一个目录
# rm -r homework rm:
是否删除 目录 "homework"? y
删除当前目录下的所有文件及目录,命令行为:
rm -r *
文件一旦通过rm命令删除,则无法恢复,所以必须格外小心地使用该命令。
6、cp
Linux cp命令主要用于复制文件或目录。
语法
cp [options] source dest
或
cp [options] source... directory
参数说明:
- -a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。
- -d:复制时保留链接。这里所说的链接相当于Windows系统中的快捷方式。
- -f:覆盖已经存在的目标文件而不给出提示。
- -i:与-f选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答”y”时目标文件将被覆盖。
- -p:除复制文件的内容外,还把修改时间和访问权限也复制到新文件中。
- -r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。
- -l:不复制文件,只是生成链接文件。
实例
使用指令”cp”将当前目录”test/”下的所有文件复制到新目录”newtest”下,输入如下命令:
cp –r test/ newtest
注意:用户使用该指令复制目录时,必须使用参数”-r”或者”-R”
7、mv
Linux mv命令用来为文件或目录改名、或将文件或目录移入其它位置。
语法
mv [options] source dest
mv [options] source... directory
参数说明:
- -i: 若指定目录已有同名文件,则先询问是否覆盖旧文件;
- -f: 在mv操作要覆盖某已有的目标文件时不给任何指示;
mv参数设置与运行结果
命令格式 | 运行结果 |
---|---|
mv 文件名 文件名 | 将源文件名改为目标文件名 |
mv 文件名 目录名 | 将文件移动到目标目录 |
mv 目录名 目录名 | 目标目录已存在,将源目录 移动到目标目录;目标 目录不存在则改名 |
mv 目录名 文件名 | 出错 |
实例
将文件 aaa 更名为 bbb :
mv aaa bbb
将info目录放入logs目录中。注意,如果logs目录不存在,则该命令将info改名为logs。
mv info/ logs
再如将/usr/student下的所有文件和目录移到当前目录下,命令行为:
mv /usr/student/* .
8、ln
Linux ln命令是一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接。
当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在 其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。
语法
ln [参数][源文件或目录][目标文件或目录]
其中参数的格式为
[-bdfinsvF] [-S backup-suffix] [-V {numbered,existing,simple}]
[–help] [–version] [–]
命令功能 :
Linux文件系统中,有所谓的链接(link),我们可以将其视为档案的别名,而链接又可分为两种 : 硬链接(hard link)与软链接(symbolic link),硬链接的意思是一个档案可以有多个名称,而软链接的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置。硬链接是存在同一个文件系统中,而软链接却可以跨越不同的文件系统。
不论是硬链接或软链接都不会将原本的档案复制一份,只会占用非常少量的磁碟空间。
软链接:
- 1.软链接,以路径的形式存在。类似于Windows操作系统中的快捷方式
- 2.软链接可以 跨文件系统 ,硬链接不可以
- 3.软链接可以对一个不存在的文件名进行链接
- 4.软链接可以对目录进行链接
硬链接:
- 1.硬链接,以文件副本的形式存在。但不占用实际空间。
- 2.不允许给目录创建硬链接
- 3.硬链接只有在同一个文件系统中才能创建
命令参数
必要参数:
- -b 删除,覆盖以前建立的链接
- -d 允许超级用户制作目录的硬链接
- -f 强制执行
- -i 交互模式,文件存在则提示用户是否覆盖
- -n 把符号链接视为一般目录
- -s 软链接(符号链接)
- -v 显示详细的处理过程
选择参数:
- -S “-S<字尾备份字符串> “或 “–suffix=<字尾备份字符串>”
- -V “-V<备份方式>”或”–version-control=<备份方式>”
- –help 显示帮助信息
- –version 显示版本信息
实例
给文件创建软链接,为log2013.log文件创建软链接link2013,如果log2013.log丢失,link2013将失效:
ln -s log2013.log link2013
输出:
[root@localhost test]# ll -rw-r--r-- 1 root bin 61 11-13 06:03 log2013.log [root@localhost test]# ln -s log2013.log link2013 [root@localhost test]# ll lrwxrwxrwx 1 root root 11 12-07 16:01 link2013 -> log2013.log -rw-r--r-- 1 root bin 61 11-13 06:03 log2013.log
给文件创建硬链接,为log2013.log创建硬链接ln2013,log2013.log与ln2013的各项属性相同
ln log2013.log ln2013
输出:
[root@localhost test]# ll lrwxrwxrwx 1 root root 11 12-07 16:01 link2013 -> log2013.log -rw-r--r-- 1 root bin 61 11-13 06:03 log2013.log [root@localhost test]# ln log2013.log ln2013 [root@localhost test]# ll lrwxrwxrwx 1 root root 11 12-07 16:01 link2013 -> log2013.log -rw-r--r-- 2 root bin 61 11-13 06:03 ln2013 -rw-r--r-- 2 root bin 61 11-13 06:03 log2013.log
9、stat
Linux stat命令用于显示inode内容(常称为 元数据)。
stat以文字的格式来显示inode的内容。
语法
stat [文件或目录]
实例
查看 testfile 文件的inode内容内容,可以用以下命令:
# stat testfile
执行以上命令输出结果:
# stat testfile #输入命令 File: `testfile' Size: 102 Blocks: 8 IO Block: 4096 regular file Device: 807h/2055d Inode: 1265161 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2014-08-13 14:07:20.000000000 +0800 Modify: 2014-08-13 14:07:07.000000000 +0800 Change: 2014-08-13 14:07:07.000000000 +0800
10、touch
Linux touch命令用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件。
ls -l 可以显示档案的时间记录。
语法
touch [-acfm][-d<日期时间>][-r<参考文件或目录>] [-t<日期时间>][--help][--version][文件或目录…]
- 参数说明:
- a 改变档案的读取时间记录。
- m 改变档案的修改时间记录。
- c 假如目的档案不存在,不会建立新的档案。与 –no-create 的效果一样。
- f 不使用,是为了与其他 unix 系统的相容性而保留。
- r 使用参考档的时间记录,与 –file 的效果一样。
- d 设定时间与日期,可以使用各种不同的格式。
- t 设定档案的时间记录,格式与 date 指令相同。
- –no-create 不会建立新档案。
- –help 列出指令格式。
- –version 列出版本讯息。
实例
使用指令”touch”修改文件”testfile”的时间属性为当前系统时间,输入如下命令:
$ touch testfile #修改文件的时间属性
首先,使用ls命令查看testfile文件的属性,如下所示:
$ ls -l testfile #查看文件的时间属性
#原来文件的修改时间为16:09
-rw-r--r-- 1 hdd hdd 55 2019-11-15 16:09 testfile
执行指令”touch”修改文件属性以后,并再次查看该文件的时间属性,如下所示:
$ touch testfile #修改文件时间属性为当前系统时间
$ ls -l testfile #查看文件的时间属性
#修改后文件的时间属性为当前系统时间
-rw-r--r-- 1 hdd hdd 55 2019-11-15 16:53 testfile
使用指令”touch”时,如果指定的文件不存在,则将创建一个新的空白文件。例如,在当前目录下,使用该指令创建一个空白文件”file”,输入如下命令:
$ touch file #创建一个名为“file”的新的空白文件
11、cat
cat 命令用于连接文件并打印到标准输出设备上。
使用权限
所有使用者
语法格式
cat [-AbeEnstTuv] [--help] [--version] fileName
参数说明:
- -n 或 –number:由 1 开始对所有输出的行数编号。
- -b 或 –number-nonblank:和 -n 相似,只不过对于空白行不编号。
- -s 或 –squeeze-blank:当遇到有连续两行以上的空白行,就代换为一行的空白行。
- -v 或 –show-nonprinting:使用 ^ 和 M- 符号,除了 LFD 和 TAB 之外。
- -E 或 –show-ends : 在每行结束处显示 $。
- -T 或 –show-tabs: 将 TAB 字符显示为 ^I。
- -e : 等价于 -vE。
- -A, –show-all:等价于 -vET。
- -e:等价于”-vE”选项;
- -t:等价于”-vT”选项;
实例:
把 textfile1 的文档内容加上行号后输入 textfile2 这个文档里:
cat -n textfile1 > textfile2
把 textfile1 和 textfile2 的文档内容加上行号(空白行不加)之后将内容附加到 textfile3 文档里:
cat -b textfile1 textfile2 >> textfile3
清空 /etc/test.txt 文档内容:
cat /dev/null > /etc/test.txt
cat 也可以用来制作镜像文件。例如要制作软盘的镜像文件,将软盘放好后输入:
cat /dev/fd0 > OUTFILE
相反的,如果想把 image file 写到软盘,输入:
cat IMG_FILE > /dev/fd0
注:
- 1. OUTFILE 指输出的镜像文件名。
- 2. IMG_FILE 指镜像文件。
- 3. 若从镜像文件写回 device 时,device 容量需与相当。
- 4. 通常用制作开机磁片。
12、more
Linux more 命令类似 cat ,不过会以一页一页的形式显示,更方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能(与 vi 相似),使用中的说明文件,请按 h 。
语法
more [-dlfpcsu] [-num] [+/pattern] [+linenum] [fileNames..]
参数:
- -num 一次显示的行数
- -d 提示使用者,在画面下方显示 [Press space to continue, ‘q’ to quit.] ,如果使用者按错键,则会显示 [Press ‘h’ for instructions.] 而不是 ‘哔’ 声
- -l 取消遇见特殊字元 ^L(送纸字元)时会暂停的功能
- -f 计算行数时,以实际上的行数,而非自动换行过后的行数(有些单行字数太长的会被扩展为两行或两行以上)
- -p 不以卷动的方式显示每一页,而是先清除萤幕后再显示内容
- -c 跟 -p 相似,不同的是先显示内容再清除其他旧资料
- -s 当遇到有连续两行以上的空白行,就代换为一行的空白行
- -u 不显示下引号 (根据环境变数 TERM 指定的 terminal 而有所不同)
- +/pattern 在每个文档显示前搜寻该字串(pattern),然后从该字串之后开始显示
- +num 从第 num 行开始显示
- fileNames 欲显示内容的文档,可为复数个数
实例
逐页显示 testfile 文档内容,如有连续两行以上空白行则以一行空白行显示。
more -s testfile
从第 20 行开始显示 testfile 之文档内容。
more +20 testfile
常用操作命令
- Enter 向下n行,需要定义。默认为1行
- Ctrl+F 向下滚动一屏
- 空格键 向下滚动一屏
- Ctrl+B 返回上一屏
- = 输出当前行的行号
- :f 输出文件名和当前行的行号
- V 调用vi编辑器
- !命令 调用Shell,并执行命令
- q 退出more
13、less
less 与 more 类似,但使用 less 可以随意浏览文件,而 more 仅能向前移动,却不能向后移动,而且 less 在查看之前不会加载整个文件。
语法
less [参数] 文件
参数说明:
- -b <缓冲区大小> 设置缓冲区的大小
- -e 当文件显示结束后,自动离开
- -f 强迫打开特殊文件,例如外围设备代号、目录和二进制文件
- -g 只标志最后搜索的关键词
- -i 忽略搜索时的大小写
- -m 显示类似more命令的百分比
- -N 显示每行的行号
- -o <文件名> 将less 输出的内容在指定文件中保存起来
- -Q 不使用警告音
- -s 显示连续空行为一行
- -S 行过长时间将超出部分舍弃
- -x <数字> 将”tab”键显示为规定的数字空格
- /字符串:向下搜索”字符串”的功能
- ?字符串:向上搜索”字符串”的功能
- n:重复前一个搜索(与 / 或 ? 有关)
- N:反向重复前一个搜索(与 / 或 ? 有关)
- b 向后翻一页
- d 向后翻半页
- h 显示帮助界面
- Q 退出less 命令
- u 向前滚动半页
- y 向前滚动一行
- 空格键 滚动一行
- 回车键 滚动一页
- [pagedown]: 向下翻动一页
- [pageup]: 向上翻动一页
实例
1、查看文件
less log2013.log
2、ps查看进程信息并通过less分页显示
ps -ef |less
3、查看命令历史使用记录并通过less分页显示
history | less
4、浏览多个文件
less log2013.log log2014.log
说明:
输入 :n后,切换到 log2014.log
输入 :p 后,切换到log2013.log
附加备注
1.全屏导航
- ctrl + F – 向前移动一屏
- ctrl + B – 向后移动一屏
- ctrl + D – 向前移动半屏
- ctrl + U – 向后移动半屏
2.单行导航
- j – 向前移动一行
- k – 向后移动一行
3.其它导航
- G – 移动到最后一行
- g – 移动到第一行
- q / ZZ – 退出 less 命令
4.其它有用的命令
- v – 使用配置的编辑器编辑当前文件
- h – 显示 less 的帮助文档
- &pattern – 仅显示匹配模式的行,而不是整个文件
5.标记导航
当使用 less 查看大文件时,可以在任何一个位置作标记,可以通过命令导航到标有特定标记的文本位置:
- ma – 使用 a 标记文本的当前位置
- ‘a – 导航到标记 a 处
14、head
在屏幕上显示指定文件的开头若干行
补充说明
head命令 用于显示文件的开头的内容。在默认情况下,head命令显示文件的头10行内容。
语法
head(选项)(参数)
选项
- -n<数字>:指定显示头部内容的行数;
- -c<字符数>:指定显示头部内容的字符数;
- -v:总是显示文件名的头信息;
- -q:不显示文件名的头信息。
参数
文件列表:指定显示头部内容的文件列表。
15、tail
在屏幕上显示指定文件的末尾若干行
补充说明
tail命令 用于输入文件中的尾部内容。tail命令默认在屏幕上显示指定文件的末尾10行。如果给定的文件不止一个,则在显示的每个文件前面加一个文件名标题。如果没有指定文件或者文件名为“-”,则读取标准输入。
注意:如果表示字节或行数的N值之前有一个”+”号,则从文件开头的第N项开始显示,而不是显示文件的最后N项。N值后面可以有后缀:b表示512,k表示1024,m表示1 048576(1M)。
语法
tail(选项)(参数)
选项
--retry:即是在tail命令启动时,文件不可访问或者文件稍后变得不可访问,都始终尝试打开文件。使用此选项时需要与选项“——follow=name”连用;
-c<N>或——bytes=<N>:输出文件尾部的N(N为整数)个字节内容;
-f<name/descriptor>或;--follow<nameldescript>:显示文件最新追加的内容。“name”表示以文件名的方式监视文件的变化。“-f”与“-fdescriptor”等效;
-F:与选项“-follow=name”和“--retry"连用时功能相同;
-n<N>或——line=<N>:输出文件的尾部N(N位数字)行内容。
--pid=<进程号>:与“-f”选项连用,当指定的进程号的进程终止后,自动退出tail命令;
-q或——quiet或——silent:当有多个文件参数时,不输出各个文件名;
-s<秒数>或——sleep-interal=<秒数>:与“-f”选项连用,指定监视文件变化时间隔的秒数;
-v或——verbose:当有多个文件参数时,总是输出各个文件名;
--help:显示指令的帮助信息;
--version:显示指令的版本信息。
参数
文件列表:指定要显示尾部内容的文件列表。
实例
tail file (显示文件file的最后10行)
tail +20 file (显示文件file的内容,从第20行至文件末尾)
tail -c 10 file (显示文件file的最后10个字符)
16、管道 |
简单来说,管道就是把前一个命令的结果当成后一个命令的输入。
管道是由内核管理的一个缓冲区,相当于我们放入内存中的一个纸条。管道的一端连接一个进程的输出。这个进程会向管道中放入信息。管道的另一端连接一个进程的输入,这个进程取出被放入管道的信息。一个缓冲区不需要很大,它被设计成为环形的数据结构,以便管道可以被循环利用。当管道中没有信息的话,从管道中读取的进程会等待,直到另一端的进程放入信息。当管道被放满信息的时候,尝试放入信息的进程会堵塞,直到另一端的进程取出信息。当两个进程都终结的时候,管道也自动消失。
实例:
查看 a.txt 文件5-10行的内容
# 在前面的 head 和 tail 命令中,只能显示前面或后面的连续内容,如果想显示中间的部分内容,就可以使用管道
head -n10 a.txt | tail -n5
查询带有关键字 python 的进程,一条一条列出。
ps -ef | grep python
17、grep
Linux grep命令用于查找文件里符合条件的字符串。
grep指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设grep指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为”-“,则grep指令会从标准输入设备读取数据。
语法
grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]
参数:
- -a或–text 不要忽略二进制的数据。
- -A<显示列数>或–after-context=<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之后的内容。
- -b或–byte-offset 在显示符合范本样式的那一列之前,标示出该列第一个字符的位编号。
- -B<显示列数>或–before-context=<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前的内容。
- -c或–count 计算符合范本样式的列数。
- -C<显示列数>或–context=<显示列数>或-<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前后的内容。
- -d<进行动作>或–directories=<进行动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
- -e<范本样式>或–regexp=<范本样式> 指定字符串做为查找文件内容的范本样式。
- -E或–extended-regexp 将范本样式为延伸的普通表示法来使用。
- -f<范本文件>或–file=<范本文件> 指定范本文件,其内容含有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每列一个范本样式。
- -F或–fixed-regexp 将范本样式视为固定字符串的列表。
- -G或–basic-regexp 将范本样式视为普通的表示法来使用。
- -h或–no-filename 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。
- -H或–with-filename 在显示符合范本样式的那一列之前,表示该列所属的文件名称。
- -i或–ignore-case 忽略字符大小写的差别。
- -l或–file-with-matches 列出文件内容符合指定的范本样式的文件名称。
- -L或–files-without-match 列出文件内容不符合指定的范本样式的文件名称。
- -n或–line-number 在显示符合范本样式的那一列之前,标示出该列的列数编号。
- -q或–quiet或–silent 不显示任何信息。
- -r或–recursive 此参数的效果和指定”-d recurse”参数相同。
- -s或–no-messages 不显示错误信息。
- -v或–revert-match 反转查找。
- -V或–version 显示版本信息。
- -w或–word-regexp 只显示全字符合的列。
- -x或–line-regexp 只显示全列符合的列。
- -y 此参数的效果和指定”-i”参数相同。
- –help 在线帮助。
实例
1、在当前目录中,查找后缀有”test”字样的文件中包含”test”字符串的文件,并打印出该字符串的行。此时,可以使用如下命令:
grep test *file
结果如下所示:
$ grep test test* #查找后缀有“test”的文件包含“test”字符串的文件 testfile1:This a Linux testfile! #列出testfile1 文件中包含test字符的行 testfile_2:This is a linux testfile! #列出testfile_2 文件中包含test字符的行 testfile_2:Linux test #列出testfile_2 文件中包含test字符的行
2、以递归的方式查找符合条件的文件。例如,查找指定目录/etc/acpi 及其子目录(如果存在子目录的话)下所有文件中包含字符串”update”的文件,并打印出该字符串所在行的内容,使用的命令为:
grep -r update /etc/acpi
输出结果如下:
$ grep -r update /etc/acpi #以递归的方式查找“etc/acpi” #下包含“update”的文件 /etc/acpi/ac.d/85-anacron.sh:# (Things like the slocate updatedb cause a lot of IO.) Rather than /etc/acpi/resume.d/85-anacron.sh:# (Things like the slocate updatedb cause a lot of IO.) Rather than /etc/acpi/events/thinkpad-cmos:action=/usr/sbin/thinkpad-keys--update
3、反向查找。前面各个例子是查找并打印出符合条件的行,通过”-v”参数可以打印出不符合条件行的内容。
查找文件名中包含test 的文件中不包含test 的行,此时,使用的命令为:
grep -v test*
结果如下所示:
$ grep-v test* #查找文件名中包含test 的文件中不包含test 的行 testfile1:helLinux! testfile1:Linis a free Unix-type operating system. testfile1:Lin testfile_1:HELLO LINUX! testfile_1:LINUX IS A FREE UNIX-TYPE OPTERATING SYSTEM. testfile_1:THIS IS A LINUX TESTFILE! testfile_2:HELLO LINUX! testfile_2:Linux is a free unix-type opterating system.
18、xargs
给其他命令传递参数的一个过滤器
补充说明
xargs命令 是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具。它擅长将标准输入数据转换成命令行参数,xargs能够处理管道或者stdin并将其转 换成特定命令的命令参数。xargs也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。xargs的默认命令是echo,空格是默 认定界符。这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代。xargs是构建单行命令的 重要组件之一。
xargs命令用法
xargs用作替换工具,读取输入数据重新格式化后输出。
定义一个测试文件,内有多行文本数据:
cat test.txt
a b c d e f g
h i j k l m n
o p q
r s t
u v w x y z
多行输入单行输出:
cat test.txt | xargs
a b c d e f g h i j k l m n o p q r s t u v w x y z
-n选项 多行输出:
cat test.txt | xargs -n3
a b c
d e f
g h i
j k l
m n o
p q r
s t u
v w x
y z
-d选项 可以自定义一个定界符:
echo "nameXnameXnameXname" | xargs -dX
name name name name
结合 -n选项 使用:
echo "nameXnameXnameXname" | xargs -dX -n2
name name
name name
读取stdin,将格式化后的参数传递给命令
假设一个命令为 sk.sh 和一个保存参数的文件arg.txt:
#!/bin/bash
#sk.sh命令内容,打印出所有参数。
echo $*
arg.txt文件内容:
cat arg.txt
aaa
bbb
ccc
xargs的一个 选项-I ,使用-I指定一个替换字符串{},这个字符串在xargs扩展时会被替换掉,当-I与xargs结合使用,每一个参数命令都会被执行一次:
cat arg.txt | xargs -I {} ./sk.sh -p {} -l
-p aaa -l
-p bbb -l
-p ccc -l
复制所有图片文件到 /data/images 目录下:
ls *.jpg | xargs -n1 -I cp {} /data/images
xargs结合find使用
用rm 删除太多的文件时候,可能得到一个错误信息:/bin/rm Argument list too long. 用xargs去避免这个问题:
find . -type f -name "*.log" -print0 | xargs -0 rm -f
xargs -0将\0作为定界符。
统计一个源代码目录中所有php文件的行数:
find . -type f -name "*.php" -print0 | xargs -0 wc -l
查找所有的jpg 文件,并且压缩它们:
find . -type f -name "*.jpg" -print | xargs tar -czvf images.tar.gz
xargs其他应用
假如你有一个文件包含了很多你希望下载的URL,你能够使用xargs下载所有链接:
cat url-list.txt | xargs wget -c
子Shell(Subshells)
运行一个 shell脚本时会启动另一个命令解释器.,就好像你的命令是在命令行提示下被解释的一样,类似于批处理文件里的一系列命令。每个shell脚本有效地运 行在父shell(parent shell)的一个子进程里。这个父shell是指在一个控制终端或在一个xterm窗口中给你命令指示符的进程。
cmd1 | ( cmd2; cmd3; cmd4 ) | cmd5
如果cmd2 是cd /,那么就会改变子Shell的工作目录,这种改变只是局限于子shell内部,cmd5则完全不知道工作目录发生的变化。子shell是嵌在圆括号()内部的命令序列,子Shell内部定义的变量为局部变量。
子shell可用于为一组命令设定临时的环境变量:
COMMAND1
COMMAND2
COMMAND3
(
IFS=:
PATH=/bin
unset TERMINFO
set -C
shift 5
COMMAND4
COMMAND5
exit 3 # 只是从子shell退出。
)
# 父shell不受影响,变量值没有更改。
COMMAND6
COMMAND7
echo / | xargs ls -ll
[root@node0001 ~]# echo /
/
[root@node0001 ~]# echo / | xargs ls -ll
total 94
dr-xr-xr-x. 2 root root 4096 Oct 23 02:59 bin
dr-xr-xr-x. 5 root root 1024 Oct 23 03:00 boot
drwxr-xr-x 18 root root 3700 Nov 15 16:36 dev
drwxr-xr-x. 61 root root 4096 Nov 15 16:36 etc
drwxr-xr-x. 2 root root 4096 Sep 23 2011 home
dr-xr-xr-x. 8 root root 4096 Oct 23 02:59 lib
dr-xr-xr-x. 9 root root 12288 Oct 23 03:00 lib64
drwx------. 2 root root 16384 Oct 23 02:58 lost+found
drwxr-xr-x. 2 root root 4096 Sep 23 2011 media
drwxr-xr-x. 2 root root 4096 Sep 23 2011 mnt
drwxr-xr-x. 2 root root 4096 Sep 23 2011 opt
dr-xr-xr-x 86 root root 0 Nov 15 16:36 proc
dr-xr-x---. 2 root root 4096 Nov 15 17:33 root
dr-xr-xr-x. 2 root root 12288 Oct 23 03:00 sbin
drwxr-xr-x. 2 root root 4096 Oct 23 02:59 selinux
drwxr-xr-x. 2 root root 4096 Sep 23 2011 srv
drwxr-xr-x 13 root root 0 Nov 15 16:36 sys
drwxrwxrwt. 3 root root 4096 Nov 15 16:36 tmp
drwxr-xr-x. 13 root root 4096 Oct 23 02:59 usr
drwxr-xr-x. 17 root root 4096 Oct 23 02:59 var