cat [选项] [文件]
查看目标文件内容
该命令一次显示一屏文本,满屏后停下来,并且在屏幕的底部出现一个提示信息,给出至今己显示的该文件的百分比。可以用下列不同的方法对提示做出回答:
Space
键:显示文本的下一屏内容。Enter
键:只显示文本的下一行内容。|
:接着输入一个模式,可以在文本中寻找下一个相匹配的模式。直接查看文件内容
more test.txt
指令会将文本内容占满终端窗口,同时在最底部的一行显示进度。按下回车键会往下读取一行,直到进度100%。或直接按下q然后回车,也会停止显示。
除此之外,可能还会搭配选项使用。
显示文件的内容,但在显示之前先清屏,并且在屏幕的最下方显示完成的百分比。
more -dc test.txt
显示文件file的内容,每10行显示一次,而且在显示之前先清屏。
more -c -10 test.txt
然而,more指令其实使用频率不是很高,因为它有点鸡肋。而且有与它类似比它更好的工具。
less [选项] [参数]
分屏上下翻页浏览文件内容
-e:文件内容显示完毕后,自动退出;
-f:强制显示文件;
-g:不加亮显示搜索到的所有关键词,仅显示当前显示的关键字,以提高显示速度;
-l:搜索时忽略大小写的差异;
-N:每一行行首显示行号;
-s:将连续多个空行压缩成一行显示;
-S:在单行显示较长的内容,而不换行显示;
-x<数字>:将TAB字符显示为指定个数的空格字符。
显示文本的同时显示行号。
less -N test.txt
按PageUp(↑)和PageDown(↓)翻页,在文件末尾时会提示如图的(end),按下q+回车退出。
less命令 的作用与more十分相似,都可以用来浏览文字档案的内容,不同的是less命令允许用户向前或向后浏览文件,而more命令只能向前浏览。用less命令显示文件时,用PageUp键向上翻页,用PageDown键向下翻页。要退出less程序,应按Q键。
关于对各种文本查看指令的比较:
head [选项] [文件]
显示文件的开头部分。
-
时,读取标准输入。打印文件前30行内容
head -30 test.txt
tail指令和head指令的语法大致相同。
tail [选项] [文件]
在屏幕上显示指定文件的末尾若干行。
-
,则读取标准输入。显示文件末尾30行的内容
tail -30 test.txt
和head指令搭配,显示文件中间20-30行的内容
head -30 test.txt > tmp.txt
tail -11 tmp.txt
但是这样的方法在文件特别大时有点尴尬。下面介绍一个重要的方法:管道。
head -30 test.txt | tail -11
这里的|
称之为管道。何为管道?在现实生活中,管道是用来传输资源的,例如石油、自来水管道等等。计算机中的管道也是被用来传输资源的,对于计算机,资源就是数据。
也就是说,管道是用来传导数据的,那么它就需要有入口和出口。在这里,head就是入口,tail就是出口。对于这两个指令本身而言,数据本来是要被输出(显示)到显示器上,但是这些数据被汇入管道中,成为管道文件。
管道文件是内存级文件,不存在于磁盘上。
同时提出一个非常重要的思想:Linux下一切皆文件。
管道可以有多个出口,搭配wc指令使用:
wc指令可以计算文件中的行数。
head -30 test.txt | tail -10 | wc -l
结果:
11
date [选项] [格式]
按选定格式显示或设置系统时间与日期
输出的时间格式:
格式设定为一个加号后接数个标记,其中常用的标记列表如下
# 格式化输出:
date +"%Y-%m-%d"
2009-12-07
# 输出昨天日期:
date -d "1 day ago" +"%Y-%m-%d"
2012-11-19
# 2秒后输出:
date -d "2 second" +"%Y-%m-%d %H:%M.%S"
2012-11-20 14:21.31
# 1234567890 秒:
date -d "1970-01-01 1234567890 seconds" +"%Y-%m-%d %H:%M:%S"
# 或者
date -d@1234567890 +"%F %T"
# 输出结果
2009-02-13 23:02:30
# 时间格式转换:
date -d "2009-12-12" +"%Y/%m/%d %H:%M.%S"
# 输出结果
2009/12/12 00:00.00
# 时间加减操作:
date +%Y%m%d # 显示年月日
date -d "+1 day" +%Y%m%d # 显示前一天的日期
date -d "-1 day" +%Y%m%d # 显示后一天的日期
date -d "-1 month" +%Y%m%d # 显示上一月的日期
date -d "+1 month" +%Y%m%d # 显示下一月的日期
date -d "-1 year" +%Y%m%d # 显示前一年的日期
date -d "+1 year" +%Y%m%d # 显示下一年的日期
# 设定时间:
date -s # 设置当前时间,只有root权限才能设置,其他只能查看
date -s 20120523 # 设置成20120523,这样会把具体时间设置成00:00:00
date -s 01:01:01 # 设置具体时间,不会对日期做更改
date -s "01:01:01 2012-05-23" # 这样可以设置全部时间
date -s "01:01:01 20120523" # 这样可以设置全部时间
date -s "2012-05-23 01:01:01" # 这样可以设置全部时间
date -s "20120523 01:01:01" # 这样可以设置全部时间
时间戳转化为时间:date +%s
时间转化为为时间戳:date -d@1508749502
unix时间戳是从1970年1月1日开始所经过的秒数(不考虑闰秒)
cal [选项] [月份] [年份]
cal命令 用于显示当前日历,或者指定日期的日历,如果没有指定参数,则显示当前月份。
一个单一的参数指定要显示的年份 (1 - 9999) ; 注意年份必须被完全地指定: cal 89 不会 显示1989年的日历. 两个参数表示月份 (1 - 12) 和年份. 如果没有指定参数, 则显示当前月份的日历.
一年从Jan 1 (1 月 1 日) 开始.
格里高利历法改革(Gregorian Reformation)被认为发生于 1752 年 9 月 3 日. 在此之前, 多数国家已经认可这项改革(尽管有一些直到 20 世纪初才认可它). 那天之后的 10 天在这项改革被略去了, 所以那个月的日历有点不太寻常.
直接cal
cal
打印日历(实际上具体日期会标识的)
August 2022
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
加上参数
cal -j
August 2022
Sun Mon Tue Wed Thu Fri Sat
213 214 215 216 217 218
219 220 221 222 223 224 225
226 227 228 229 230 231 232
233 234 235 236 237 238 239
240 241 242 243
cal -3
July 2022 August 2022 September 2022
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 1 2 3 4 5 6 1 2 3
3 4 5 6 7 8 9 7 8 9 10 11 12 13 4 5 6 7 8 9 10
10 11 12 13 14 15 16 14 15 16 17 18 19 20 11 12 13 14 15 16 17
17 18 19 20 21 22 23 21 22 23 24 25 26 27 18 19 20 21 22 23 24
24 25 26 27 28 29 30 28 29 30 31 25 26 27 28 29 30
31
find [选项] [参数]
find命令 用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
事实上find指令的选项非常多,而且很多也是经常使用的。但是最最常用的莫过于这个,所以初学时主要掌握这个就足够了。
查找某条路径下的某个文件
find /home/xy/test test.txt
/home/xy/test
/home/xy/test/test.txt
test.txt
列出当前目录及子目录下所有文件和文件夹
find .
在/home
目录下查找以.txt结尾的文件名
find /home -name "*.txt"
同上,但忽略大小写
find /home -iname "*.txt"
which [选项] [指令名]
which命令 用于查找并显示给定命令的绝对路径,环境变量PATH中保存了查找命令时需要遍历的目录。which指令会在环境变量$PATH设置的目录里查找符合条件的文件。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。
查找cd命令路径
which cd
/usr/bin/cd
查找pwd命令路径
which pwd
/usr/bin/pwd
查找ls命令路径
which ls
alias ls='ls --color=auto'
/usr/bin/ls
我们知道ls命令是ll -s的简写,但查它的路径时怎么会有个alias呢?原来,alias是给指令起别名,alias 别名='指令'
。这是Linux自带的,也许是维护的大佬设置的。
whereis [选项] [指令名]
whereis命令 用来定位指令的二进制程序、源代码文件和man手册页等相关文件的路径。
whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。
和find相比,whereis查找的速度非常快,这是因为linux系统会将 系统内的所有文件都记录在一个数据库文件中,当使用whereis和下面即将介绍的locate时,会从数据库中查找数据,而不是像find命令那样,通 过遍历硬盘来查找,效率自然会很高。 但是该数据库文件并不是实时更新,默认情况下时一星期更新一次,因此,我们在用whereis和locate 查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。
查找ls指令
whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz
grep [选项] [字符串/关键字] [文件]
grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。用于过滤/搜索的特定字符。可使用正则表达式能配合多种命令使用,使用上十分灵活。
简单地说,它就是一个行文本过滤器。
查看文件中有5的每行。关键字加不加双引号都可以。
grep 5 file.txt
查找并在管道中查看内容
grep "5" file.txt | cat
当然也可以用tac反向显示行内容。
也可以写入到文件中
grep "5" file.txt | tac | head -3 > tmp.txt
cat tmp.txt
35 hello world
25 hello world
15 hello world
有点炫酷。
对搜索到的行内容显示行号。
grep -n "5" file.txt
zip/unzip [选项] [被压缩文件/.zip文件]
将目录压缩
zip test.zip test/*
解压到指定目录tmp
unzip test.zip -d /tmp
tar [选项] [文件]
将许多文件一起保存至一个单独的磁带或磁盘归档,并能从归档中单独还原所需文件。
tar命令(tarfile) 可以为linux的文件和目录创建档案。利用tar,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。tar最初被用来在磁带上创建档案,现在,用户可以在任何设备上创建档案。利用tar命令,可以把一大堆的文件和目录全部打包成一个文件,这对于备份文件或将几个文件组合成为一个文件以便于网络传输是非常有用的。
首先要弄清两个概念:打包和压缩。打包是指将一大堆文件或目录变成一个总的文件;压缩则是将一个大的文件通过一些压缩算法变成一个小文件。
为什么要区分这两个概念呢?这源于Linux中很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你得先将这一大堆文件先打成一个包(tar命令),然后再用压缩程序进行压缩(gzip bzip2命令)。
将 /home/vivek/bin/
目录打包,并使用 gzip 算法压缩。保存为 /tmp/bin-backup.tar.gz
文件。
tar -zcvf /tmp/bin-backup.tar.gz /home/vivek/bin/
- z:有gzip属性的
- j:有bz2属性的
- Z:有compress属性的
- v:显示所有过程
- O:将文件解开到标准输出
tar -cf archive.tar foo bar # 从文件 foo 和 bar 创建归档文件 archive.tar。
tar -tvf archive.tar # 详细列举归档文件 archive.tar 中的所有文件。
tar -xf archive.tar # 展开归档文件 archive.tar 中的所有文件。
压缩: zip -r [目标文件名].zip [原文件/目录名]
解压: unzip [原文件名].zip
注:-r参数代表递归
打包:tar -cvf [目标文件名].tar [原文件名/目录名]
解包:tar -xvf [原文件名].tar
注:c参数代表create(创建),x参数代表extract(解包),v参数代表verbose(详细信息),f参数代表filename(文件名),所以f后必须接文件名。
压 缩:tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称
查 询:tar -jtv -f filename.tar.bz2
解压缩:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录
其中诸如-jcv -f
可以写成-jcvf
「tab」:命令补全,档案补齐
例如当前目录下只有一个目录或文件,按下tab键自动补齐命令
cd+tab
↓
cd linux/
如果有很多个目录或文件,如:abc.txt,bc.txt,b.txt三个文件
打开abc.txt
cd a+tab
↓
cd abc.txt
打开bc.txt
cd b+tab
由于有两个文件是b开头的,按下tab键后会罗列出以b开头的文件,所以要输到不同子母的位置再按tab才会自动补齐,以此类推。
「ctrl」+ c:有时候命令按错但不想重新改,有时输入命令很久都没有运行完毕,这时候可以键入它以终止指令和终止当前程序运行。
「ctrl」+ d:键入结束或表示exit。
shutdown [选项]
安装和登录命令:login、shutdown、halt、reboot、install、mount、umount、chsh、exit、last;
文件处理命令:file、mkdir、grep、dd、find、mv、ls、diff、cat、ln;系统管理相关命令:df、top、free、quota、at、lp、adduser、groupadd、kill、crontab;
系统安全相关命令:passwd、su、umask、chgrp、chmod、chown、chattr、sudo ps、who;
网络操作命令:ifconfig、ip、ping、netstat、telnet、ftp、route、rlogin、rcp、finger、mail、 nslookup;
其它命令:gunzip、unarj、mtools、man、unendcode、uudecode。
a
Linux下拥有最高权限的是root用户。除了它之外,还可以有其他用户。所以Linux下有两种用户:超级用户(root)和普通用户。
注意:超级用户的命令提示符是#
,普通用户是$
。
su [用户名]
切换用户。
如果从普通用户切换到超级用户,用户名可省略不用加root。
su
用一个例子理解:user代表宪法,group代表government(中文自己查),o代表外国人。
用ll显示文件的详细信息。
drwxrwxr-x 4 xy xy 4096 Aug 9 21:58 Code
-rw-rw-r-- 1 xy xy 70 Aug 9 23:04 test1.txt
其中rwx分别代表读、写和执行权限。
在这里我们主要了解前部分的三个对象的权限。实际上,为了省去记忆rwx权限的顺序和字母表示,通常用二进制表示这三个权限的开启(1)或关闭(0),同样,我们用八进制表示每个对象的总权限。
例如rwx rwx rwx,那么以二进制的视角是111 111 111,以八进制的视角是777,以此类推。
由于不同文件或目录有不同的重要性,因此它们给不同的用户的权限也是不同的。
chmod [参数][选项][文件名]
mode:八进制数或符号组合。
file:指定要更改权限的一到多个文件。
-R:递归地修改目录及目录下的文件权限。此选项需要root用户。
为组用户添加写权限,也就是说组用户本身只有读和执行权限即r-x
chmod g+w test.txt
增加或删除其他用户的权限以此类推,不过注意修改root用户的权限需要root权限(这里的权限是root本身的权限,不是用户对文件的权限)
删除所有用户的写权限
chmod a-w test.txt
删除其他用户的所有
chmod o= test.txt
同时也可以以八进制设置用户权限
chmod 777 test.txt
相当于给文件设置rwx rwx rwx权限,其他以此类推。
umask [选项][数字或符号组合]
抛出问题:为何我们通过ls -a
查看文件或目录时,它们的默认权限都是不同的?这是如何做到的呢?难道系统知道该给什么目录或文件以什么权限吗?
系统确实会给文件或目录以默认权限,但是没有那么智能。首先说明x,即可执行权限对文件目录非常重要,可执行权限决定了用户是否能进入目录。而大多数文件都不是可执行文件,因此系统给三种用户的文件的默认权限是删除了可执行权限x的。也即:
umask(user file-creatiopn mode mask),用户掩码,由于系统给文件或目录的默认权限是666或777,这是无法改变的,只能通过umask间接改变文件或目录的权限。
掩码一共有四位数字,四位数表示四组权限值,分别是文件特殊权限,文件所有者权限,文件所属用户组权限,其他用户权限。 这里我们先忽略掉文件特殊权限位。
首先给出公式:默认权限-umask掩码=最终权限。
umask值指的是需要从原始默认权限减掉的权限。
我们已经知道r、w、x的数值分别是4、2、1。 所以如果要去掉写权限,umask值中相应的位就是2,如果要去掉读权限,那就是4,去掉读与写权限,就是6,去掉执行与写权限,就是3,去掉读与执行的权限,就是5。
而我们通过-S选项的输出u=rwx,g=rx,o=rx可以看出,u=rwx表示文件所有者权限没有去掉任何权限,对应umask相应位的数值为0, g=rx,o=rx表示文件所属用户组和其他用户去掉了w权限,对应的umaks相应位的数值就是2,所有umask的数值为0022。
这样文件的默认权限就是:
原始默认权限(-rw-rw-rw-) - umask掩码(-----w–w-) = (最终默认权限)-rw-r–r–;
目录的默认权限就是:
原始默认权限(drwxrwxrwx) - umask掩码(d----w–w-) = (最终默认权限)drwxr-xr-x。
# 以八进制数的形式输出创建文件的权限掩码。
umask -p
# 执行结果:
umask 0022
# 以符号组合的方式输出创建文件的权限掩码。
umask -S
# 执行结果:
u=rwx,g=rx,o=rx
chmod +t [文件名或目录名]
开门见山,在Linux默认情况下,不论文件或目录的创建者是谁,任何人都能删除它们,为了解决这一尴尬问题,在修改权限是添加t,增加粘滞位。这样的效果让文件或目录只能被创建者删除。
注意:超级用户(root)能删除任何文件或目录,也就是说,粘滞位对超级用户无效。
加上粘滞位
chmod +t test.txt
能保证在同一个目录下不同用户管理自己的文件(新建或删除),于是有了粘滞位
chmod +t 文件名 .
可以理解为x的特殊情况:这样不同用户就只能删除自己的文件,不能删除其他文件.
注意:
理解:我能删除别人文件的原因?
chown [参数][用户名][文件名]
chown命令 改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组。用户可以是用户或者是用户D,用户组可以是组名或组id。文件名可以使由空格分开的文件列表,在文件名中可以包含通配符。
只有文件主和超级用户才可以便用该命令。
直接修改一个文件
chown user1 test.txt
修改目录及其所有子目录和子文件
chown -R user2 /home/user1/test