Linux常见的Shell命令

1.具体的shell命令用法可以通过help或man命令进入手册来查询其具体的用法。
2.终端本质上对应着linux上的/dev/tty设备,linux的多用户登录就是通过不同的/dev/tty设备完成的,linux默认提供了6个纯命令行界面的’‘terminal’’(准确的说这里应该是6个虚拟控制台)来让用户登录,在物理机系统上你可以通过ctrl+alt+F1~F6进行切换。当切换到其中一个终端后,想要切换回图形界面,可以按下ctrl+alt+F7来完成。
3.命令行提示符$表示普通用户,#表示root用户。
4.几个技巧:

  • Tab键:补全命令、参数
  • Ctrl+C:强制退出当前程序
  • Ctrl+Z:将当前程序放到后台,拖回前台输入命令fg
  • Ctrl+A:将光标输入行开始,相当于home键
  • Ctrl+E:将光标输入行结束,相当于End键
  • 在终端切换以root账户登录: sudo su 退出输入: exit

5.linux中常用的通配符

  • * 匹配0或多个字符
  • ? 匹配任意1个字符
  • [list] 匹配list中的任意单一字符
  • [!list] 匹配除list中的任意单一字符以外的字符
  • [c1-c2] 匹配c1-c2中的任意单一字符,如:[0-9][a-z]
  • {strin1,string2,…} 匹配string1或string2(或更多)其1字符串
  • {c1…c2} 匹配c1-c2中全部字符串,如{1…10},如利用通配符批量创建5个文件 touch file{1…5}.txt

6.常用的shell命令总结

(1) pwd(printing working directory):显示当前目录

  • 格式:pwd [参数]
  • 可选参数:
  • -P 显示物理地址,为默认值
  • -L 目录为连接路径时,显示连接路径

(2) wc(word count):用来计算数字,利用wc指令可以计算文件的byte数、字数或行数,若不指定文件名称,或是所给予的文件名为"-",则wc指令会从标准输入设备读取数据。

  • 格式:wc [选项] [文件]
  • 可选参数:
  • -c 只显示bytes数
  • -l 只显示行数
  • -w 只显示字数
  • -m 只统计字符数
  • -L 打印最长行行数
  • 如,统计/bin目录下的命令个数:ls /bin | wc -l

(3) cd(change directory):切换当前目录到指定目录

  • 格式: cd [目录名]
  • 几个特殊参数:
  • /:系统根目录
  • .:当前系统目录
  • …:当前目录的父目录
  • ~:当前用户主目录,即/home/cdl目录
  • -:上次所在目录

(4) ls(list):列出对应目录清单

  • 格式为:ls [选项] [目录名]
  • 可选参数为:
  • -a:列出目录下所有文件
  • -l:除文件名外,打印包括文件权限,大小等详细信息
  • -d:directory,显示文件夹即可,不显示其下具体的文件
  • -h:以容易理解的方式列出文件大小,1k=1048
  • -t:按时间顺序排列
  • 目录名缺省为当前目录,如,列出/home文件夹下的所有文件和目录的详细信息
  • ls -al /home
  • 以容易理解的格式列出/home目录中所有以"m"开头的文件目录的大小
  • cd /home ls -lh m*

(5) mkdir(make directory):创建目录名

  • 格式:mkdir [选项] [目录名]
  • 可选参数:
  • -m:mode,设置权限
  • -p:parents,创建多个目录
  • -v:verbose,每次创建新目录都显示信息
  • 如,一次创建多个目录,并且显示具体的创建信息 mkdir -vp temp/text
  • 创建权限为777的目录 mkdir -m 777 temp

(6) touch:用于把已存在文件的时间标签更新为系统的当前时间(默认方式),它们的数据将原封不动的保留下来;用于创建新的空文件

  • 格式:touch [选项] [文件]
  • 可选参数:
  • -a:只更改存取时间
  • -c:不创建文件
  • -d<时间日期>/-t<时间日期>:使用指定的时间
  • -m:只更改变动时间
  • 如,创建文件text1 touch text1

(7) rm(remove):删除目录中的文件或目录,对于链接文件,只删除链接

  • 格式:rm [选项] [文件或目录名]
  • 可选参数:
  • -f:force,忽略不存在的文件,不给提示
  • -i:interactive,交互式删除
  • -v:verbose,详细显示步骤
  • -r:递归删除
  • 如,删除后缀名为.log的所有文件,删除前逐一询问 rm -i *.log
  • 删除/var/log/httpd/access目录以及其下所以文件、文件夹:rm -rf /var/log/httpd/access

(8) mv(move):移动或更改文件名,常用来备份文件或目录

  • 格式: mv [选项] [源文件或目录] [目标文件或目录]
  • 可选参数:
  • -b:back,覆盖前先备份
  • -f:force,强行覆盖
  • -i:interactive,询问是否覆盖
  • -u:update,目标文件已经存在,源文件较新时更新
  • -t:target,移动多个源文件到一个目录下,此时目标目录在前,源文件在后
  • 如,将文件a.txt移动到test1目录下,如果文件存在,覆盖前询问是否覆盖 mv -i a.txt test1(test1目录已经存在,否则会执行重命名)
  • sudo mv opencv-3.3.1/ opencv-3.3.1-dev

(9) cp(copy):复制文件或目录

  • 格式: cp [选项] [源文件] [目录]
  • 可选参数:
  • -t:target,指定目标目录,此时目标目录在前,源文件在后
  • -f:force,强行复制
  • -i:interactive,询问是否复制
  • -u:update,目标文件已经存在,源文件较新时更新
  • -n:no-clobber,不要覆盖已经存在的文件
  • -s:symbolic-link,建立源文件的符号链接,而非复制文件
  • -r:复制文件夹
  • 如,将test1目录下的所有文件复制到test2目录下,覆盖前询问 cp -i test1/* test2

(10) cat(concatenate):将文件或标准输入组合输出到标准输出,常用来显示文件内容或连接文件,反向显示文件内容命令为tac

  • 格式:cat [选项] [文件]
  • 可选参数:
  • -A:show all
  • -b:对非空输出行 编号
  • -n:对所有输出行进行行编号
  • -s:多个空白行转换为一个空白符
  • 例如将a.log文件的内容加上行号后输入到b.log这个文件中,多个空行转换成一个行输出 cat -ns a.log > b.log

(11) nl(number of lines):计算文件中的行数

  • 格式:nl [选项] [文件]
  • 可选参数:
  • -b a:空行也列出行号,类似于cat -n
  • -b t:空行不列出行号,默认值
  • -w:行号栏位的位数
  • -n ln:行号在自己栏位的最左方显示
  • -n rn:行号在自己栏位的最右方显示,不加0
  • -n rz:行号在自己栏位的最右方显示,加0
  • 如,把a.log的文件内容加上行号后显示,行号在屏幕右方加0显示,行号栏占位数为3
  • nl -n rz -w 3 a.log

(12) more:功能类似于cat,cat将文件内容从上到下显示,more命令一页页显示,方便阅读,按空格键往下翻,按b(back)键显示上一页,=键输出当前行号,q键退出more。此外还可以搜索字符串

  • 格式:more [选项] [文件]
  • 可选参数:
  • +n:从第n行开始显示
  • -n:定义屏幕大小为n行
  • +/pattern:在文件显示前搜索字符串pattern,从该字符串前两行开始显示
  • 如,从a.log文件中查找第一个出现"g"字符串的行,并从该处前两行开始显示输出,规定每屏的行数为5
  • more -5 +/g a.log

(13) less:对文件及输出的显示工具,功能非常强大

  • 格式:less [选项] [文件]
  • 可选参数:
  • -f:强迫打开
  • -i:忽略大小写
  • -N:显示每列行号
  • -s:显示连续空行为一行
  • 常用操作:
  • /字符串:向下搜索字符串
  • ?字符串:向上搜索字符串
  • 如,显示文件a.log中的内容,搜索字符串"hello",可以使用如下命令 less a.log /hello
  • less与cat和more的区别:
  • cat命令用于显示整个文件的内容,单独使用没有翻页功能。因此经常和more命令搭配使用,cat命令还有就是可以将多个文件合并成一个文件的功能。
  • more命令功能:让画面在显示满一页时暂停,此时可按空格键继续显示下一个页面,或按q键退出显示
  • less命令功能:less命令与more命令类似,也可以用了浏览超过一页的文件。所不同的是less命令除了可以按空格键向下显示文件外,还可以利用上下键来卷动文件。当要结束浏览时,只要在less命令的提示符:下按q键即可。其实这三个命令除了cat命令有合并文件的功能外,其余功能上相似,只是从浏览习惯和显示方式上有所不同。

(14) head:显示文件的开头,默认为前10行,对应于tail命令,显示文件末尾内容

  • 格式:head [选项] [文件]
  • 可选参数:
  • -q:隐藏文件名
  • -v:显示文件名
  • -c <字节数>:显示字节数
  • -n <行数>:显示行数,参数为负时显示文件末尾行
  • 如,显示a.log和b.log文件的前5行内容 head -n 5 a.log b.log

(15) which:在PATH变量指定的路径中搜索可执行文件的所在位置,一般用来确认系统中是否安装了指定软件

  • 如,确认是否正确安装了gcc,使用which gcc

(16) whereis:定位文件,还可以搜索源代码,指定备用搜索路径和搜索不寻常项的能力。whereis命令查找速度非常快,因为它根本不是在磁盘中漫无目的乱找,而是在一个数据库(/var/lib/mlocate/)查询。这个数据库是linux系统自动创建的,包含本地所有文件的信息,并且每天通过自动执行updatedb命令更新一次。也正因为这个数据库要每天才更新一次,就会使得whereis命令的搜索结果有时候不准确,比如刚刚添加的文件可能搜索不到。

  • 格式:whereis [选项] [文件]
  • 可选参数:
  • -b:定位可执行文件
  • -m:定位帮助文件
  • -s:定位源代码文件
  • 如,搜索gcc帮助文件的路径 whereis -m gcc

(17) locate:与whereis命令类似,且使用相同的数据库。但whereis命令只能搜索可执行文件、联机帮助文件和源代码文件,如果要获得更全面的搜索结果,可以使用locate命令。

  • 格式:locat [选项] [搜索字符串]
  • 可选参数:
  • -q:quiet,不显示出错信息
  • -n:至多显示n个输出
  • -r:使用正则表达式作搜索条件
  • 如,搜索etc目录下所有以sh开头的文件,可以使用这样的命令 locate /etc/sh

(18) find:沿文件层次结构向下遍历,匹配符合条件的文件,并执行相应操作

  • 格式:find [搜索路径] [表达式]
  • 默认路径是当前目录,默认表达式为 -print
  • 可选参数:
  • -print:输出到标准输出
  • -delete:删除搜索到的文件
  • -exec:对匹配的文件执行参数给出的shell命令
  • -name:按文件名查找文件
  • -type:按类型查找文件,常用文件类型有b(块设备文件)、c(字符设备文件)、d(目录)、f(普通文件)、l(符号链接)
  • -perm:根据文件权限查找文件
  • -user:所有者选项
  • -mtime -n +n:按照文件更改时间查找文件,-n表示更改时间小于n天,+n表示更改时间大于n天
  • -size +10k/-10k/10k:搜索大于/小于/等于10k的文件
  • 逻辑操作符:-add -or -not ():圆括号字符在shell中有特殊含义,所以在命令中使用它们的时候需要引起来,通常使用转义字符
  • 如,打印当前目录下所有以.txt结尾的符号链接
  • find . -type l -name “.txt” -print
  • 打印当前目录下所有权限是777的php文件
  • find . -type f -name “.php” -perm 777
  • 打印当前目录下root用户拥有的所有文件
  • find . -type f -user root
  • 打印当前目录下权限不是777和664的所有文件
  • find . -type f (! -perm 777 -and ! -perm 664 )
  • 现在想要把所有c语言代码文件下载下来,如果一个一个下载很麻烦,可以先查找到所有的c语言代码文件,然后将这些文件内容写到一个文件中,下载该文件
  • find . -name “*.c” -exec cat {} ; > all.c
  • 解释:{}其实是一个占位符,在find命令的执行过程中会不断地替换成当前找到的文件;是exec命令结束的标记,因为规定-exec后面的命令必须以;结束,但;在shell中有特殊含义,所以这里进行转义。

(19) xargs:可以从标准输入接收输入,并把输入转换为一个特定的参数列表

  • 格式:command | xargs [选项] [command]
  • 可选参数:
  • -n:指定每行最大的参数数量
  • -d:指定分隔符
  • 如,echo “nameXnameXnameXname” | xargs -dX -n2
  • 查找当前目录下所有c代码文件,统计总行数
  • find . -type f -name “*.c” | xargs wc -l
  • 将find产生的输出(test2目录下的所有py文件)作为rm的参数,从而完全删除
  • find test2/ -name “.py” | xargs rm -rf

(20) grep:一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来

  • 格式:grep [选项] pattern [文件]
  • 可选参数:
  • -c:计算搜索到字符串即pattern的次数
  • -i:忽略大小写
  • -n:输出行号
  • -v:反向选择,打印不匹配的行
  • -r:递归搜索
  • -E:将范本样式为延伸的普通表示法来使用,意味着使用扩展正则表达式
  • -color=auto:找到的关键字加颜色显示
  • -o:只打印匹配项,一个个按列显示
  • 如,将/etc/passwd文件中出现root的行取出来,关键字部分加颜色显示
  • grep “root” /etc/passwd --color=auto
  • 将/etc/passwd文件中没有出现root和nologin的行取出来
  • grep -v “root” /etc/passwd | grep -v “nologin”
  • 在当前目录下递归搜索文件中包含main()的文件,经常用于查找某些函数位于哪些源码文件中
  • grep -r “main()”
  • 正则表达式
  • 正则表达式是一种符号表示法,被用来识别文本模式。在某种程度上,它们与匹配文件和路径名的shell通配符比较相似,但其规模更大。形式和功能上正则表达式和通配符很像,不过它们之间又有很大区别,特别在于一些特殊的匹配字符的含义上,比如*在通配符中表示0或多个字符,而在正则表达式中为匹配之前字符串的0次或多次。
  • 如,利用linux系统自带的字典查找一个5个字母的单词,第3个字母是j,最后一个字母为r
  • grep “^…j.r$” /usr/share/dict/words

(21) cut:一个将文本按列进行切分的小工具,可以指定分隔每列的定界符。如果一行数据包含多个字段(多列),现在想要提取其中的一列或多列,这时候cut命令将可以使用了。

  • 格式:cut [选项 ] [文件名]
  • 可选参数:
  • -b:以字节为单位进行分割
  • -c:以字符为单位进行分割,-c -5 前5个,-c 5- 前5个之后,-c 5 第5个, -c 2-5 第2个到第5个
  • -d:自定义分隔符,默认是制表符
  • -f:自定义字段,如一列和三列-f 1,3, 第一列 -f 1,前三列 -f 1-3
  • -complement:抽取除-c,-f指定的文本外的整个文本行
  • 如,提取student.txt文件中除第一列的其他列 cut -f 1 -d ’ ’ student.txt -complement

(22) sed:属于流编辑器,即在编辑文件的时候不用把整个文件都读入内存,可以一行行的读入,操作完成后再读入下一行,可以占用较小的内存资源。

  • 格式:sed [选项] [操作] [文件名]
  • 如将/etc/passwd的内容列出并且打印行号,同时,请将第2-5行删除
  • nl /etc/passwd | sed ‘2,5d’
  • 与grep一样,sed也支持特殊元字符,来进行模式查找与替换。不同的是,sed使用的正则表达式是括在/之间的模式。如果要把正则表达式分隔符/改为另一个字符,比如o,只要在这个字符前加入一个,在字符后跟上正则表达式,再跟上这个字符即可。

(23) paste:与cut指令相反,它会添加一个或多个文本列到文件中,而不是从文件中抽取文本列

  • 格式:paste [选项] [文件名]
  • 可选参数:
  • -s:将每个文件合并成行,而不是单独的黏贴
  • -d:自定义分隔符,默认是制表符
  • 如,将student.txt和telephone.txt文件中的内容按列拼接,指定分隔符是: paste student.txt telephone.txt -d ‘:’

(24) tr(translate):常被用来更改字符,可以看作是一种基于字符的查找与替换操作。换字是一种把字符从一个字母转换成另一个字母的过程。tr 从标准输入中替换、缩减、删除字符,并将结果写到标准输出。

  • 格式:tr [选项] SET1 SET2
  • 可选参数:
  • -d:删除匹配SET1的内容,不作替换
  • 如,将输入的字符大写转换为小写
  • echo ‘THIS IS CDL’ | tr ‘A-Z’ ‘a-z’
  • 如,将输入的字符中的数字删除
  • echo ‘THIS 123 IS CDL!’ | tr -d ‘0-9’

(25) sort:对于文件及标准输入的文本进行从小到大的排序

  • 格式:sort [选项] [文件名]
  • 可选参数:
  • -n:基于字符串的长短进行排序
  • -k:指定排序关键词
  • -b:排序时忽略每行开头空格
  • -r:以相反的顺序即降序排列
  • -t:自定义分隔符,默认是制表符
  • 如,列出/usr/bin/目录下使用空间最多的前10个目录文件
  • ls -l /usr/bin | sort -nr -k 5 | head -n 10

(26) uniq(unique):用于报告或忽略文件真的重复行,只能用于排过序的数据,常和sort命令结合使用

  • 格式:uniqu [选项] [文件名]
  • 可选参数:
  • -c:在每行前加上出现次数的标号
  • -d:只输出重复出现的行
  • -u:只显示唯一的行
  • 如,找出/bin目录和/usr/bin目录下所有相同的命令
  • ls /bin /usr/bin | sort | unqiu -d

(27) join:用来将两个文件中制定栏位内容相同的行连接起来。找出两个文件中,指定栏位内容相同的行,并加以合并,再输出到标准输出设备。与uniqu命令相同,常用于已经排序后的数据。

  • 格式:join [选项] 文件1 文件2
  • 可选参数:
  • -j FIFLD(等同于-1 FIFLD -2 FIFLD):两个文件匹配字段相同
  • 如,指定两个文件的第三个字段为匹配字段,连接两个文件 join -1 3 -2 3 c.txt d.txt

(28) common:逐行比较文本文件,显示结果包括3列:第一列是只在第一个文件中找到的行;第二列是只在第二个文件中找到的行;第三列是两个文件的共同行,与uniqu、join相同,只能用在已经排好序的数据

  • 格式:common [选项] [文件1] [文件2]
  • 可选参数:
  • -1:不能输出文件1特有的行
  • -2:不能输出文件2特有的行
  • -3:不能输出两个文件共有的行
  • 如,比较file1.txt和file2.txt两个文件的内容,只显示两个文件共有的内容 common -12 file1.txt file2.txt

(29) diff(differential):在最简单的情况下,比较两个文件的不同,如果使用-代替文件参数,则要比较的内容将来自标准输入。diff命令是以逐行的方式,比较文本文件的异同处。如果该命令指定进行目录的比较,则将会比较该目录中具有相同文件名的文件,而不会对其子目录文件进行任何比较操作。

  • 格式: diff [选项] 文件
  • 可选参数:
  • -c:上下文模式
  • -u:统一模式
  • -a:逐行比较
  • -r:递归比较目录下的文件

(30) patch:被用来把更改的地方应用到文件中。它接收从diff程序的输出,并且通常被用来将较老的文件版本转变为较新的文件版本。

  • 使用diff/patch组合有两个优点:
  • 一个diff文件非常小,与整个源码树的大小相比较而言
  • 一个diff文件简洁地显示了所做的修改地方,从而允许程序补丁的审阅者能快速地评估它。
  • 当然,diff/patch命令能工作在任何文本文件,不仅仅是源码文件
  • 准备一个diff文件供patch命令使用,diff -Naur old_file new_file > diff_file
  • 格式:patch [选项] 补丁文件
  • 可选参数:
  • -p num:忽略几层文件夹
  • -E:发现空文件时删除
  • -R:取消打过的补丁
  • 如,生成file1.txt和file2.txt的diff文件,然后应用patch命令更新file1.txt文件
  • diff -Naur file1.txt file2.txt > patchdiff.txt
  • patch < patchdiff.txt
  • 取消打过的补丁
  • patch -R < patchdiff.txt

(31) df(disk free):检查linux服务器的文件系统的磁盘占用情况

  • 格式:df [选项] 文件
  • 可选参数:
  • -a:全部文件系统列表
  • -h:方便阅读显示
  • -i:显示inode信息
  • -T:文件系统类型
  • -t <文件系统类型>:只显示选定文件系统的磁盘信息
  • -X <文件系统类型>:不显示选定文件系统的磁盘信息
  • 如,指定类型磁盘 df -t ext4

(32) du(disk usage):对文件和目录使用空间的查看

  • 格式:du [选项] 文件
  • 可选参数:
  • -a:显示目录中个别文件的大小
  • -b:显示大小时以byte为单位
  • -k:显示大小时以KB为单位
  • -m:显示大小时以MB为单位
  • -s:仅显示总计,列出最后加总的值
  • -h:以K,M,G为单位,提供可读性
  • -c:除显示单独目录大小外,显示所有目录和文件总和
  • 如,显示几个文件或目录各自占用磁盘空间的大小,并统计总和
  • du -ch file1.txt file2.txt
  • 按照空间大小逆序排列显示
  • du -h | sort -nr | head -n 10

(33) time:测量一个命令的运行时间

  • 格式:time 命令
  • 如,将命令date的运行时间保持到本地文件中
  • {time date;} > 1.txt

(34) clear:清屏