技术交流QQ群:1027579432,欢迎你的加入!
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命令。
- 格式:locate [选项] [搜索字符串]
- 可选参数:
- -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,只要在这个字符前加入一个\,在字符后跟上正则表达式,再跟上这个字符即可。
- 格式:sed [选项] [操作] [文件名]
- (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'
- -d:删除匹配SET1的内容,不作替换
- (25) sort:对于文件及标准输入的文本进行从小到大的排序
- 格式:sort [选项] [文件名]
- 可选参数:
- -n:基于字符串的长短进行排序
- -k:指定排序关键词
- -b:排序时忽略每行开头空格
- -r:以相反的顺序即降序排列
- -t:自定义分隔符,默认是制表符
如,列出/usr/bin/目录下使用空间最多的前10个目录文件
ls -l /usr/bin | sort -nr -k 5 | head -n 10
- (26) uniqu(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
- -j FIFLD(等同于-1 FIFLD -2 FIFLD):两个文件匹配字段相同
- (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
- 使用diff/patch组合有两个优点:
- (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
- 格式:time 命令
- (34) clear:清屏