Linux系统Shell基本命令
下面是经常使用到的Linux系统Shell基本命令,这里汇总一下,便于以后查阅。
- 1. 命令入门
- 2. help命令
- 3. man命令
- 4. echo
- 5. test
- 6. type
- 7. file
- 8. ls
- 9. pwd和history
- 10. cd
- 11. ps
- 12. pstree
- 13. mkdir
- 14、rm
- 15. cp
- 16. mv
- 17. ln
- 18. du
- 19. stat
- 20. touch
- 21. kill
- 22. whereis
- 23. locate
- 24. find
- 25. pstree
- 26. read
1. 命令入门
命令提示符详解
进入Linux系统,通过root用户登录,会出现[root@localhost ~]#
,含义为:
- 用户名root
- 主机名localhost
- 当前用户目录
~
#
为系统权限
而普通用户[lucy@localhost ~]$
中的$
为普通权限。
~
为当前用户目录,在别的目录下只会显示目录名。
root为超级管理员,拥有一切系统权限,可通过cd ~
进入root用户主目录下,普通用户lucy,可通过~lucy
进入其主目录下。
命令格式:
命令 选项 参数 (三者之间要有空格,区分大小写)
即 command [-options] [args]
[args]
为参,多个参数之间用空格分隔。
2. help命令
2.1 help
使用help查看内建命令的帮助(enable查看内建命令)
1 | [root@layne ~]# help -s cd |
但是help只能查看内建命令,比如我想查看mv的帮助信息就不行:
1 | [root@layne ~]# help mv |
那么我们怎么知道哪些是内建命令呢?
1 | [root@layne ~]# enable |
enable也不用背,该方式比较费时间,help无法使用时,根据提示换其他帮助方式就ok了。
2.2 --help
如输入mv --help
可查看mv的命令介绍。
3. man命令
操作快捷键:
- enter向下一行
- 空格按页向下翻,b向上翻页 或
ctrl +f
向下翻页,ctrl+b
向上翻页 - p直接翻到首页
- 查找按 /要查找的内容,查找 下一个/上一个:按n/N(即Shift +n);
- 退出按q
man:
- 1用户命令(/bin,/usr/bin,/usr/local/bin)
- 2系统调用
- 3库函数
- 4特殊文件(设备文件)
- 5文件格式(配置文件的语法)
- 6游戏
- 7杂项(Miscellaneous)
- 8管理命令(/sbin,/usr/sbin,/usr/local/sbin)
自己尝试以下 man 2 read
和man read
的区别。
4. echo
echo $x
输出变量xecho "hello"
输出字符串echo "hello layne" > log.txt
将输出的内容写入到log.txt,如果文件不存在,则会直接创建文件并写入内容。echo "hello layne123456" >> log.txt
将输出的内容追加到log.txt。echo -n
表示不要另起新行,如输入echo -n "hello world"
-e
表示解释逃逸字符,如输入echo -e "hello \nworld"
5. test
几个算术运算符:
- gt表示greater than,即大于
- lt表示less than,即小于
- eq表示equal,即等于
- ge表示大于等于
- le表示小于等于
命令:
test 3 -gt 2
测试3大于2echo $?
返回上一条命令执行的结果(linux中0表示正确,1表示错误)
test 3 -ge 3 && echo 'yes'
表示3大于等于3成立,然后执行逻辑与,输出yes
test 3 -ge 5 || echo 'no'
表示3大于等于2不成立,然后执行逻辑或,输出no
除了test,还可以用[ ]
1 | [root@node1 ~]# [ 3 -gt 2 ] |
- []和内容之间一定要有空格,否则抛错。
[ -d $mydir ]
测试mydir变量是否是一个目录
当在shell中执行命令的时候,默认到PATH指定的路径中查找可执行文件。
如果在PATH中的多个目录都包含该可执行文件,则执行最先找到的。
输入echo $PATH
可输出环境变量:
如果执行命令的时候,识别不到任何一个path路径下的命令,会提示命令不识别。
6. type
type打印一个字符串的类型,可能的值为:别名,内置命令,函数,关键字,可执行文件或者什么都不输出(不是前面的类型)。
type命令可以识别外部命令和内部命令(内建命令)
查看命令的type:
1 | [root@layne ~]# type cd |
别名也可以用alias命令查看,如:
1 | [root@layne ~]# alias ll |
查看yum命令的类型:
1 | [root@layne ~]# type yum |
yum是外部命令
7. file
file命令:检查文件的类型。
1 | [root@layne ~]# file /usr/bin/yum |
yum命令是外部命令,它的文件是python脚本类型文件。
1 | [root@layne ~]# file /bin/ls |
ls是二进制可执行文件(ELF)。
8. ls
ls命令用于列出目录内容
ls -a /
显示根目录下所有文件ls -l /
以格式化的形式显示文件ls -a -l
以格式化形式显示根目录下所有文件ls -ali /
列出文件和目录的inode信息(相当于c语言的指针)ls / /usr
可以后面跟多个目录,列出多个目录的内容ll
相当于ls -l --color=auto
- ls 等于ls ./
ls也支持通配符
ls *log
ls install*
ls \*tall\*
9. pwd和history
pwd
打印当前工作目录路径
history
打印历史命令
10. cd
cd用于更改shell工作目录,也就是切换目录,cd全称是change directory
如果cd后什么都不写,表示直接回当前用户家目录,在root下相当于cd ~
。
cd后也可以跟减号(-)用以表示回到最后一次切换之前的目录,多次使用减号在最近两个目录之间切换
root用户可以直接通过绝对路径进到普通用户的家目录,也可以直接跟波浪线用户名表示直接进入到某个用户的家目录
1 | cd /home/god #切换到god家目录 |
超级管理员root的家目录在根目录下,即/root,普通用户的家目录在home下。
11. ps
可以通过命令查看系统内进程信息(查看当前运行的进程信息)
进程查看命令ps
(process status) :将某个时间点的程序运作情况截取下来
选项和参数 :
- a : 显示所有程序
- x :显示所有程序,不区分终端机
- u :以用户为主的格式来显示
常用组合 :
ps aux
观察系统所有的进程数据
ps -ef
显示所有进程基本信息(比aux
较简略一些)
ps -ef|grep mysql
查看有关mysql的进程
例如:
1 | [root@layne ~]# ps aux |
下为各选项的含义:
- USER:该 process 属于那个使用者
- PID :该 process 的程序标识符。
- %CPU:该 process 使用掉的 CPU 资源百分比;
- %MEM:该 process 所占用的物理内存百分比;
- VSZ :该 process 使用掉的虚拟内存量 (Kbytes)
- RSS :该 process 占用的物理的内存量 (Kbytes)
- TTY :该 process 是在那个终端机上面运作,若与终端机无关则显示
?
。另外,tty1-tty6 是本机上面的登入者程序,若为 pts/0 等,则表示为由网络连接进主机的程序。 - STAT:该进程目前的状态,状态显示与
ps -l
的 S 旗标相同 (R/S/D/T/Z) - START:该 process 被触发启动的时间
- TIME :该 process 实际使用 CPU 运作的时间。
- COMMAND:该程序的实际命令
另外,输入ps -ef
如下:
1 | [root@layne ~]# ps -ef |
- STIME 该进程什么时候启动的
- PPID 为进程的父进程ID
12. pstree
Linux pstree命令将所有行程以树状图显示
ps
查看进程数
13. mkdir
mkdir用于创建目录
mkdir a1 a2 a3
创建目录a1、a2、a3mkdir -p a/b/c
可以添加**-p**选项,用以创建多层目录,因为系统发现某一级目录不存在的时候创建父目录mkdir ./abc/1dir ./abc/2dir ./abc/3dir
用于一次性创建多个目录
可以使用大括号高效创建相似的目录
1 | mkdir ./abc/{x,y,z}dir (不连续的) #创建xdir、ydir、zdir目录 |
touch用于创建文件,如torch a.txt
创建文件a.txt
touch a.txt b.txt
创建两个文件
14、rm
删除之前一定要备份,打包加日期。除非确定以后真的不用了
rm用于删除文件
rm a.txt
删除文件a.txt,需要按y确认删除rm -f file
,删除文件,不需要确认强制删除
如果rm的参数是目录,则会提示需要迭代删除而不能成功
rm -r dira
用于删除目录rm -rf dira
删除目录,不要确认,此命令慎用
尤其是 rm -rf /
,这个命令直接删除整个Linux操作系统
15. cp
cp用于拷贝文件
cp a.txt b.txt abc/
拷贝两个文件到abc目录下cp /root/install.log /root/abc/xdir/
也可以是绝对路径cp ~/install.log .
拷贝用户目录下的文件到当前文件夹下cp a.txt zz.txt
将文件a.txt复制为zz.txt
cp -r 目录 目标目录
用于拷贝整个目录
cp -r efg/ abc/
拷贝efg文件夹到abc文件夹下
加上-f
表示覆盖已经存在的目标文件而不给出提示。但是,我试了还是提示我覆盖,哈哈,以后有时间再试试
16. mv
mv用于移动或重命名文件
既可以移动文件,也可以移动目录,即可为文件改变,也可以为目录改名。
mv a.txt b.txt x/y
复制两个文件到x/y目录下mv abc/ x/y
复制目录abc到x/y目录下
Linux中没有专门改名的命令,mv兼职改名工作:
mv zdir zzdir
将zdir目录改名为zzdirmv zz.txt zk.txt
将zz.txt文件改名为zk.txt
17. ln
ln 用于创建硬链接或软链接
创建硬链接
1 | [root@layne laydir]# cp /etc/profile ./ |
创建软链接
让ln2指向profile, 给profile创建软链接
1 | [root@layne laydir]# ln -s profile ln2 |
创建完两个链接后,修改ln1、ln2、profile任何一个文件的内容,都会导致这三个文件改变,说明确实实现了链接的功能。
输入ll -i
在 Linux 中,元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点号)才是文件的唯一标识而非文件名。文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。
文件的 inode 值,可以简单把它想成 C 语言中的指针,它指向了物理硬盘的一个区块。只要一个文件的inode存在,它就不会从硬盘上消失。
看上图,可以发现:
- 硬链接和原文件的inode信息一样,软链接和原文件的inode信息不一样。
- 软链接ln2的类型是
l
,说明是链接类型,而硬链接ln1和原文件的类型都是-
,说明这两个都是文件类型。 - 图片上也显示了l
ln2->profile
,说明ln2这个链接指向profile文件
下面我试着删除 profile 文件,然后通过cat
命令分别输出软硬链接的文件内容:
删除文件后,硬链接ln1输出了profile文件里面的内容,软链接ln2报错cat: ln2: No such file or directory
这说明,硬链接ln1没有丝毫地影响,因为它的 inode 所指向的区块由于有一个硬链接在指向它,所以这个区块仍然有效,并且可以访问到。然而软链接的 inode 所指向的内容实际上是保存了一个绝对路径,当用户访问这个文件时,系统会自动将其替换成其所指的文件路径,由于这个文件已经被删除了,所以自然就会显示无法找到该文件了。
接下来,我向这个软连接ln2写点东西,会发现刚才删除的profile文件竟然又出现了!这就说明,当我们写入访问软链接时,系统自动将其路径替换为其所代表的绝对路径,并直接访问那个路径了。
18. du
du (英文全拼:disk usage)命令用于显示目录或文件的大小。
du 会显示指定的目录或文件所占用的磁盘空间。
- a :列出所有的文件与目录容量
- h :以人们较易读的容量格式(G/M/K)显示
- s :summarize 仅显示总计。
- k :以 KBytes 列出容量显示
- m :以 MBytes 列出容量显示
du /root
统计/root下的目录或文件所占用的磁盘空间。(如果只输入du
表示统计当前目录下的)
1 | [root@layne laydir]# du /root |
添加-s参数可以生成指定目录的汇总信息,也就是共占用多大的磁盘空间
1 | [root@layne laydir]# du -s /root |
添加-h参数可以显示为人类可以读懂的格式
1 | [root@layne laydir]# du -sh /root |
将路径写成./*
统计当前目录下每项内容占用的磁盘空间信息
1 | [root@layne laydir]# du -sh /root/* |
查看/usr/local目录下共占用多大磁盘空间
1 | [root@layne laydir]# du -sh /usr/local |
19. stat
stat命令用于显示inode内容。
stat以文字的格式来显示inode的内容。
例如,查看 etc下的profile文件的inode内容内容,可以用以下命令:
1 | [root@layne laydir]# stat /etc/profile |
20. touch
用于创建文件
touch a.txt b.txt
创建a.txt和b.txt
touch 对于已存在的文件,抹平各个时间(不会改变里面的内容)
touch 对于不存在的文件,则创建文件
21. kill
杀死进程
kill -9 pid (见人就杀,不做善后工作)
kill -15 pid (调用destory方法善后,)
优先使用 -15,因为-15温柔一些,会做一些善后的处理,不行再用-9
22. whereis
作用:locate the binary, source, and manual page files for a command.即:定位/返回与指定名字匹配的二进制文件(参数-b)、源文件(参数-s)和man帮助手册(参数-m)文件所在的路径。如果省略参数,则返回所有信息。
和find相比,whereis查找的速度非常快,这是因为linux系统会将系统内的所有文件都记录在一个数据库文件中,当使用whereis和下面即将介绍的locate时,会从数据库中查找数据,而不是像find命令那样,通过遍历硬盘来查找,效率自然会很高。
但是该数据库文件并不是实时更新,默认情况下时每天自动更新一次,因此,我们在用whereis和locate 查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。 可以通过updatedb
去读取 /etc/updatedb.conf 这个配置文件的设定,更新整个数据库!因为 updatedb 会去查找硬盘,所以执行 updatedb ,可能会等待数分钟。
原理:whereis命令首先会去掉filename中的前缀空格和以.开头的任何字符,然后再在数据库(var/lib/slocate/slocate.db)中查找与上述处理后的filename相匹配的二进制文件、源文件和帮助手册文件,使用之前可以使用updatedb命令手动更新数据库。
命令参数:
-b 定位可执行文件。
-m 定位帮助文件。
-s 定位源代码文件。
-u 搜索默认路径下除可执行文件、源代码文件、帮助文件以外的其它文件。
-B 指定搜索可执行文件的路径。
-M 指定搜索帮助文件的路径。
-S 指定搜索源代码文件的路径。
适用场合:二进制文件、源文件和帮助手册文件路径的查找。
1 | [root@layne apps]# whereis java |
23. locate
locate而且使用范围比whereis大的多,只需要部分文件名就可以进行模糊查询,同时locte还可以通过-r
选项使用正则表达式,功能十分强大。与whereis一样 locate使用的索引数据库里的信息并不一定是实时有效的,可以使用updatedb命令更新索引数据库。
原理:默认情况下(当filename中不包含通配符),locate会给出所有与filename相匹配的文件的路径。
适用场合:没有文件类型性质的模糊查找(你只记得某个文件的部分名称)。
1 | [root@layne apps]# locate java|head -n 5 |
24. find
参数说明:
时间查找参数:
- -atime n: 在过去n天内被读取过的文件
- -cmin n : 在过去 n 分钟内被创建的文件 (按文件创建时间来查找文件)
- -mmin n:在过去 n 分钟内被修改过的文件(按文件更改时间来查找文件)
- -ctime n: 在过去n天内被创建的文件(按文件创建时间来查找文件)
- -mtime n: 在过去n天内被修改过的文件(按文件更改时间来查找文件)
- -newer file: 把比file还要新的文件列出来
名称查找参数:
- -gid n: 寻找群组ID为n的文件
- -group name: 寻找群组名称为name的文件
- -uid n: 寻找拥有者ID为n的文件
- -user name: 寻找拥有者名称为name的文件
- -name file: 寻找文件名为file的文件(可以使用通配符)
其它参数:
- -type c : 文件类型是 c 的文件。
- d: 目录
- c: 字型装置文件
- b: 区块装置文件
- p: 具名贮列
- f: 一般文件
- l: 符号连结
- s: socket
- -size n[c] #查长度为n块[或n字节]的文件
- -user username #按文件属主来查找
- -group groupname #按组来查找
作用:search for files in a directory hierarchy. 从当前目录递归的搜索文件(通过遍历硬盘来查找)。
这里介绍一下时间查找参数的含义,以-mtime参数为例
1 | -mtime n :n 为数字,意义为在 n 天之前被更改过的文件; |
比如
1 | +4代表>=5天前的文件名:ex> find /var -mtime +4 #查看/var目录下>=5天前的文件名 |
find的使用实例:
-
find . -name "*.c"
将当前目录及其子目录下所有文件后缀为 .c 的文件列出来 -
find . -type f
将目前目录其其下子目录中所有一般文件列出 -
find . -ctime -20
将当前目录及其子目录下所有最近 20 天内更新过的文件列出 -
find /var/log -type f -mtime +7 -ok rm {} \;
查找 /var/log 目录中更改时间在 7 日以前的普通文件,并在删除之前询问它们 -
find . -type f -mmin -10
搜索当前目录中,所有过去10分钟中更新过的普通文件。如果不加-type f参数,则搜索普通文件+特殊文件+目录。 -
find . -name "my*" -ls
搜索当前目录中,所有文件名以my开头的文件,并显示它们的详细信息。 -
find /home -size +512k
查大于512k的文件 -
find /home -size -512k
查小于512k的文件 -
find /home -user noas
找到目下下所有该用户的文件 -
find / -nouser
#找到不数据任何用户的文件
25. pstree
pstree
打印进程树(有的子进程折叠)
pstree -p
打印并展开所有的进程树,并显示每个进程的id
26. read
read命令用于从标准输入读取数值。
read 内部命令被用来从标准输入读取单行数据。这个命令可以用来读取键盘输入,当使用重定向的时候,可以读取文件中的一行数据。
语法:read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
参数说明:
- -a 后跟一个变量,该变量会被认为是个数组,然后给其赋值,默认是以空格为分割符。
- -d 后面跟一个标志符,其实只有其后的第一个字符有用,作为结束的标志。
- -p 后面跟提示信息,即在输入前打印提示信息。
- -e 在输入的时候可以使用命令补全功能。
- -n 后跟一个数字,定义输入文本的长度,很实用。
- -r 屏蔽\,如果没有该选项,则\作为一个转义字符,有的话 \就是个正常的字符了。
- -s 安静模式,在输入字符时不再屏幕上显示,例如login时输入密码。
- -t 后面跟秒数,定义输入字符的等待时间。
- -u 后面跟fd,从文件描述符中读入,该文件描述符可以是exec新开启的。
现在来试试吧。
(1)简单读取
创建文件a.sh,内容为:
1 |
|
执行:
1 | [root@layne rdir]# chmod +x a.sh |
(2)-p
参数,允许在 read 命令行中直接指定一个提示。
创建文件b.sh,内容为:
1 |
|
执行:
1 | [root@layne rdir]# chmod +x b.sh |
(3)-t
参数指定 read 命令等待输入的秒数,当计时满时,read命令返回一个非零退出状态。
创建c.sh,内容:
1 |
|
执行(不输入,等待 5 秒后):
1 | [root@layne rdir]# chmod +x c.sh |
(4)除了输入时间计时,还可以使用 -n 参数设置 read 命令计数输入的字符。当输入的字符数目达到预定数目时,自动退出,并将输入的数据赋值给变量。
创建d.sh,内容:
1 |
|
执行:
1 | [root@layne rdir]# chmod +x d.sh |
该例子使用了-n 选项,后接数值 1,指示 read 命令只要接受到一个字符就退出。只要按下一个字符进行回答,read 命令立即接受输入并将其传给变量,无需按回车键。
(5)-s 选项能够使 read 命令中输入的数据不显示在命令终端上(实际上,数据是显示的,只是 read 命令将文本颜色设置成与背景相同的颜色)。输入密码常用这个选项。
创建e.sh,内容:
1 |
|
执行:
1 | [root@layne rdir]# chmod +x e.sh |
(6) 读取文件
每次调用 read 命令都会读取文件中的 “一行” 文本。当文件没有可读的行时,read 命令将以非零状态退出。
通过什么样的方法将文件中的数据传给 read 呢?使用 cat 命令并通过管道将结果直接传送给包含 read 命令的 while 命令。
创建test.txt,内容如下:
1 | 123 |
创建f.sh,内容为:
1 |
|
执行:
1 | [root@layne rdir]# chmod +x f.sh |
(7)read在不提供参数的时候,会将用户的输入存储在REPLY变量中
1 | [root@layne rdir]# read |