在it行业工作十年有余,由于我们实际部署运行的软件环境是linux,故把经常用的linux命令记录下来,且由于使用的linux系统有差异(早年是2011年Ubuntu,freebsd,centos),我就以这几年一直使用的centos为例总结以前常用命令。
前提安装一台装有centos的电脑,略,也可申请一台阿里云ecs,参考https://developer.aliyun.com/article/773002?spm=a2c6h.13148508.0.0.56f34f0ezHMbRC
也可以http://www.linuxbasics.in/how-to-install-centos-7-rhel-7/
- cd目录切换
在linux文件系统上,你可以使用切换目录命令cd来将shell会话切换到另一个目录。cd命令的格式很简单:
cd 目录名称
cd命令可带单个参数即目录名称。如果用户没有为cd指定目标路径,则它将切换到用户主目录。
然而目标路径参数可以使用两种方式表达:
1.1 绝对文件路径
绝对文件路径定义了在linux文件系统中该目录的确切位置,以根目录开始,相当于目录的全名。
因此,要引用usr目录中包含的lib目录中的NetworkManager目录,用户可以使用绝对文件路径:
[root@iZbp114fcr9i7o48lvhommZ ~]# cd /usr/lib/NetworkManager/
[root@iZbp114fcr9i7o48lvhommZ NetworkManager]#
采用绝对文件路径,直接说明用户想要切换到的确切目录。要用绝对文件路径来切换到文件系统中的某个位置,用户只需在cd命令后指定全路径名即可。如上,此时的工作目录已是/usr/lib/NetworkManager。
用户可以通过绝对文件路径切换到整个linux文件系统的任何一级。
1.2 相对文件路径
相对文件路径允许用户指定一个基于当前位置的目标文件路径,而无需再从根目录开始。相对文件路径不以代表根目录的正斜线(/)开头,而以目录名(如果用户准备切换到当前工作目录下的一个目录)或是一个表示基于用户当前目录的相对位置的特殊字符开始。有两个特殊字符:
1.2.1 单点符(.),表示当前目录
1.2.2 双点符(..),表示当前目录的父目录。
2. ls 列表
列表命令ls可用于显示系统上有哪些文件。格式如下
ls [选项] [目录名]
2.1 基本列表功能
ls命令最基本的格式会显示当前目录下的文件和目录:
[root@iZbp114fcr9i7o48lvhommZ ~]# cd /home/
[root@iZbp114fcr9i7o48lvhommZ home]# ls
datascience face-api-master jpadmin readme.md
注意,ls命令输出的列表是按字母排序的。
如果想区分文件和目录,可以加 -F参数,输出如下:
[root@iZbp114fcr9i7o48lvhommZ home]# ls -F
datascience/ face-api-master/ jpadmin/ me.sh* readme.md
-F参数在目录名后加了正斜线(/),以方便用户在输出中分辨出它们是目录。类似的,它会在可执行文件(比如me.sh)后面加个星号,以便用户找出在系统上可运行的文件。
在linux上,有一种文件叫隐藏文件,它通常是以句点开始的文件,可以在ls命令后加 -a参数把隐藏文件和普通文件和目录一起显示出来。
[root@iZbp114fcr9i7o48lvhommZ home]# ls -aF
./ ../ .abc datascience/ face-api-master/ jpadmin/ me.sh* readme.md
如果想递归显示目录下包含的目录中的文件,则可使用-R参数,略不演示
2.2 输出详细信息
ls命令并未输出每个文件的太多相关信息,而要显示更多信息,则要使用另一常用的参数-l,-l参数会产生长列表格式的输出,包含了目录中每个文件的更多相关信息:
[root@iZbp114fcr9i7o48lvhommZ home]# ls -l
total 0
drwxr-xr-x 5 root root 266 Oct 1 18:35 datascience
drwxr-xr-x 6 root root 229 Sep 21 14:24 face-api-master
drwx------ 9 jpadmin jupyterhub 276 Sep 22 23:46 jpadmin
-rwxrwxrwx 1 root root 0 Oct 1 18:22 me.sh
-rw-r--r-- 1 root root 0 Oct 1 17:58 readme.md
这种长列表格式的输出在每一行中列出了单个文件和目录。除了文件名,输出中还有其他有用信息。
输出的第一行显示了在目录中包含的块的总数,之后每一行都包含了关于文件或目录的下述信息:
文件类型,比如目录(d)、文件(-)、链接(l)、字符型文件(c)或块文件(b);
文件的权限;
文件的硬链接总数;
文件属主的用户名;
文件属组的组名;
文件的大小(以字节为单位);
文件的上次修改时间;
文件名或目录名。
2.3 过滤输出列表
默认情况下,ls命令会输出目录下的所有文件。可有时会觉得输出过多,以为只需要查看个别文件,此时ls命令还支持在命令行下定义过滤器。它会用过滤器来决定应该在输出中显示哪些文件或目录。
这个过滤器就是进行简单文本匹配的字符串。你可以在要用的命令行参数后添加过滤器。
[root@iZbp114fcr9i7o48lvhommZ home]# ls -l
total 0
drwxr-xr-x 5 root root 266 Oct 1 18:35 datascience
drwxr-xr-x 6 root root 229 Sep 21 14:24 face-api-master
drwx------ 9 jpadmin jupyterhub 276 Sep 22 23:46 jpadmin
-rwxrwxrwx 1 root root 0 Oct 1 18:22 me.sh
-rw-r--r-- 1 root root 0 Oct 1 18:50 myproa
-rw-r--r-- 1 root root 0 Oct 1 18:50 myproaaa
-rw-r--r-- 1 root root 0 Oct 1 18:50 myprob
-rw-r--r-- 1 root root 0 Oct 1 17:58 readme.md
[root@iZbp114fcr9i7o48lvhommZ home]# ls -l myproa
-rw-r--r-- 1 root root 0 Oct 1 18:50 myproa
当用户指定特定文件的名称作为过滤器时,ls命令只会显示那个文件的信息。
有时你可能不知道要找的那个文件的确切名称,可以用标准通配符,并在过滤器用它们来进行模式匹配。
问号?代表一个字符;
星号*代表零个或多个字符。
问号?可用在过滤器字符串中替代任意位置的单个字符,例如:
[root@iZbp114fcr9i7o48lvhommZ home]# ls -l mypro?
-rw-r--r-- 1 root root 0 Oct 1 18:50 myproa
-rw-r--r-- 1 root root 0 Oct 1 18:50 myprob
其中,过滤器mypro?与目录中的两个文件匹配。
类似的,星号可用来匹配零个或多个字符
[root@iZbp114fcr9i7o48lvhommZ home]# ls -l mypro*
-rw-r--r-- 1 root root 0 Oct 1 18:50 myproa
-rw-r--r-- 1 root root 0 Oct 1 18:50 myproaaa
-rw-r--r-- 1 root root 0 Oct 1 18:50 myprob
2.4 完整的参数列表
[root@iZbp114fcr9i7o48lvhommZ home]# man ls
略
3 . pwd 显示当前目录
pwd命令,可以用来显示当前工作目录
[root@iZbp114fcr9i7o48lvhommZ home]# pwd
/home
[root@iZbp114fcr9i7o48lvhommZ home]# cd
[root@iZbp114fcr9i7o48lvhommZ ~]# pwd
/root
[root@iZbp114fcr9i7o48lvhommZ ~]#
4. touch 创建文件
你总会时不时的遇见创建空文件的情况,这时,可以用touch命令来轻松创建空文件
[root@iZbp114fcr9i7o48lvhommZ home]# ls -l test1
ls: cannot access 'test1': No such file or directory
[root@iZbp114fcr9i7o48lvhommZ home]# touch test1
[root@iZbp114fcr9i7o48lvhommZ home]# ls -l test1
-rw-r--r-- 1 root root 0 Oct 1 21:37 test1
[root@iZbp114fcr9i7o48lvhommZ home]# ls -il test1
50982604 -rw-r--r-- 1 root root 0 Oct 1 21:37 test1
[root@iZbp114fcr9i7o48lvhommZ home]#
touch命令创建了你指定的新文件,并将你的用户名作为文件的属主。
因为在ls命令中我们采用了-il参数,所以输出结果的第一列显示了分配给该文件的索引节点号。在linux文件系统中,每个文件都有唯一的索引节点号。
注意,文件的大小为零,这是因为touch命令只创建了一个空文件。
touch命令还可以用来改变已有文件的访问时间和修改时间,而不改变文件的内容。
[root@iZbp114fcr9i7o48lvhommZ home]# touch test1
[root@iZbp114fcr9i7o48lvhommZ home]# ls -l test1
-rw-r--r-- 1 root root 0 Oct 1 21:45 test1
注意,test1文件的修改时间现在已经从原来的时间更新了(21:37》21:45)。如果只改变访问时间,可用-a参数。如果只改变修改时间,可用-m参数。默认情况下,touch使用当前时间。你可以使用-t参数加上特定的时间戳来知道时间。
[root@iZbp114fcr9i7o48lvhommZ home]# touch -t 201912251200 test1
[root@iZbp114fcr9i7o48lvhommZ home]# ls -l test1
-rw-r--r-- 1 root root 0 Dec 25 2019 test1
[root@iZbp114fcr9i7o48lvhommZ home]#
注意文件的修改时间已经被设定为另外一个时间了
5. 复制文件cp命令
对系统管理员来说,在文件系统中将文件和目录从一个位置复制到另一个位置是家常便饭,而cp命令可完成此任务。
在最基本的用法里,cp命令需要两个参数,源对象和目标对象:
cp 源对象 目标对象
当源对象和目标对象参数都是文件名时,cp命令将源文件复制到一个新文件,并且以目标对象命名。
新文件就像个全新的文件一样,有新的创建时间和修改时间。
[root@iZbp114fcr9i7o48lvhommZ home]# cp test1 test2
[root@iZbp114fcr9i7o48lvhommZ home]# ls -il test*
50982604 -rw-r--r-- 1 root root 0 Dec 25 2019 test1
51268950 -rw-r--r-- 1 root root 0 Oct 1 22:01 test2
新文件test2显示了一个不同的索引节点号,说明它是一个崭新的文件。同时你也会发现test2到修改时间是它创建的时间。
如果目标文件已经存在了,那么cp命令将会提示你是否要覆盖已有文件
[root@iZbp114fcr9i7o48lvhommZ home]# cp test1 test2
cp: overwrite 'test2'? y
如果不回答y,文件复制将不会继续。
也可以将文件复制到现有目录中。
[root@iZbp114fcr9i7o48lvhommZ home]# mkdir /cp
[root@iZbp114fcr9i7o48lvhommZ home]# cp test1 /cp
[root@iZbp114fcr9i7o48lvhommZ home]# ls -il /cp
total 0
101731624 -rw-r--r-- 1 root root 0 Oct 1 22:09 test1
[root@iZbp114fcr9i7o48lvhommZ home]#
新文件现在已在目录cp中了,和源文件同名。
cp命令同ls命令一样,也有很多参数
可以使用-p参数来为目标文件保留文件的访问时间和修改时间
[root@iZbp114fcr9i7o48lvhommZ home]# cp -p test1 test3
[root@iZbp114fcr9i7o48lvhommZ home]# ls -il test*
50982604 -rw-r--r-- 1 root root 0 Dec 25 2019 test1
51268950 -rw-r--r-- 1 root root 0 Oct 1 22:06 test2
51268951 -rw-r--r-- 1 root root 0 Dec 25 2019 test3
现在,即使文件test3是个全新的文件,它也和源文件test1有同样的时间戳。
-R参数极其强大,它允许你通过一个命令递归的复制整个目录的内容。
[root@iZbp114fcr9i7o48lvhommZ home]# mkdir /cp2
[root@iZbp114fcr9i7o48lvhommZ home]# cp -R /cp /cp2
[root@iZbp114fcr9i7o48lvhommZ home]# ls -il /cp2
total 0
4434683 drwxr-xr-x 2 root root 19 Oct 1 22:21 cp
[root@iZbp114fcr9i7o48lvhommZ home]# ls -il /cp2/cp/
total 0
4434684 -rw-r--r-- 1 root root 0 Oct 1 22:21 test1
现在cp2是cp的完整副本。
在cp命令中还可以使用通配符:
[root@iZbp114fcr9i7o48lvhommZ home]# cp -f test* /cp2
[root@iZbp114fcr9i7o48lvhommZ home]# ls -il /cp2/
total 0
4434683 drwxr-xr-x 2 root root 19 Oct 1 22:21 cp
118203005 -rw-r--r-- 1 root root 0 Oct 1 22:25 test1
118203006 -rw-r--r-- 1 root root 0 Oct 1 22:25 test2
118203007 -rw-r--r-- 1 root root 0 Oct 1 22:25 test3
这个命令将所有文件名以test开头的文件复制到目录cp2。-f参数用来强制覆盖cp2目录中已有的文件,而不提示用户。
6. 重命名文件,mv命令
在linux中,重命令文件称为移动(moving)。mv命令就是用来将文件和目录移动到另外一个位置的:
[root@iZbp114fcr9i7o48lvhommZ home]# ls -il test*
50982604 -rw-r--r-- 1 root root 0 Dec 25 2019 test1
51268951 -rw-r--r-- 1 root root 0 Dec 25 2019 test3
51268950 -rw-r--r-- 1 root root 0 Oct 1 22:06 test4
[root@iZbp114fcr9i7o48lvhommZ home]# mv test1 test5
[root@iZbp114fcr9i7o48lvhommZ home]# ls -il test*
51268951 -rw-r--r-- 1 root root 0 Dec 25 2019 test3
51268950 -rw-r--r-- 1 root root 0 Oct 1 22:06 test4
50982604 -rw-r--r-- 1 root root 0 Dec 25 2019 test5
注意,移动文件会改变文件名。但保持同样的索引节点号和时间戳。移动一个有软连接指向它的文件会带来麻烦:
[root@iZbp114fcr9i7o48lvhommZ home]# cp -s test3 test1
[root@iZbp114fcr9i7o48lvhommZ home]# ls -il test*
51268952 lrwxrwxrwx 1 root root 5 Oct 1 23:01 test1 -> test3
51268951 -rw-r--r-- 1 root root 0 Dec 25 2019 test3
51268950 -rw-r--r-- 1 root root 0 Oct 1 22:06 test4
50982604 -rw-r--r-- 1 root root 0 Dec 25 2019 test5
[root@iZbp114fcr9i7o48lvhommZ home]# cp -l test3 test2
[root@iZbp114fcr9i7o48lvhommZ home]# ls -il test*
51268952 lrwxrwxrwx 1 root root 5 Oct 1 23:01 test1 -> test3
51268951 -rw-r--r-- 2 root root 0 Dec 25 2019 test2
51268951 -rw-r--r-- 2 root root 0 Dec 25 2019 test3
51268950 -rw-r--r-- 1 root root 0 Oct 1 22:06 test4
50982604 -rw-r--r-- 1 root root 0 Dec 25 2019 test5
[root@iZbp114fcr9i7o48lvhommZ home]# mv test3 test6
[root@iZbp114fcr9i7o48lvhommZ home]# ls -il test*
51268952 lrwxrwxrwx 1 root root 5 Oct 1 23:01 test1 -> test3
51268951 -rw-r--r-- 2 root root 0 Dec 25 2019 test2
51268950 -rw-r--r-- 1 root root 0 Oct 1 22:06 test4
50982604 -rw-r--r-- 1 root root 0 Dec 25 2019 test5
51268951 -rw-r--r-- 2 root root 0 Dec 25 2019 test6
[root@iZbp114fcr9i7o48lvhommZ home]#
此时test1已是无效链接了
也可以用mv命令来移动目录
[root@iZbp114fcr9i7o48lvhommZ home]# mkdir mv1
[root@iZbp114fcr9i7o48lvhommZ home]# mv mv1 mv2
现在当前目录下只有目录名mv2了。
7. 删除文件,rm命令
在linux中,删除(deleting)叫做移除(removing),命令简写rm,格式如下
rm 参数 文件/目录名
[root@iZbp114fcr9i7o48lvhommZ home]# ls -il test2
51268951 -rw-r--r-- 2 root root 0 Dec 25 2019 test2
[root@iZbp114fcr9i7o48lvhommZ home]# rm -i test2
rm: remove regular empty file 'test2'? y
[root@iZbp114fcr9i7o48lvhommZ home]# ls -il test2
ls: cannot access 'test2': No such file or directory
[root@iZbp114fcr9i7o48lvhommZ home]#
如果你要删除很多文件而不想被提示符烦到,可以用-f参数来强制删除,小心为妙!!!!!!
[root@iZbp114fcr9i7o48lvhommZ home]# ls -il test6
51268951 -rw-r--r-- 1 root root 0 Dec 25 2019 test6
[root@iZbp114fcr9i7o48lvhommZ home]# rm -f test6
[root@iZbp114fcr9i7o48lvhommZ home]# ls -il test6
ls: cannot access 'test6': No such file or directory
[root@iZbp114fcr9i7o48lvhommZ home]#
8. 创建目录,mkdir命令
在linux中创建目录很简单,只要用mkdir命令就行
[root@iZbp114fcr9i7o48lvhommZ home]# mkdir dir1
[root@iZbp114fcr9i7o48lvhommZ home]# mkdir dir2 dir3
[root@iZbp114fcr9i7o48lvhommZ home]# mkdir -p dir4/dir
[root@iZbp114fcr9i7o48lvhommZ home]# ls -il
total 0
17399656 drwxr-xr-x 5 root root 266 Oct 1 23:23 datascience
19181767 drwxr-xr-x 2 root root 6 Oct 1 23:27 dir1
38633003 drwxr-xr-x 2 root root 6 Oct 1 23:27 dir2
51268953 drwxr-xr-x 2 root root 6 Oct 1 23:27 dir3
68215670 drwxr-xr-x 3 root root 17 Oct 1 23:33 dir4
系统创建了三个目录,并分别给它们分配了一个新的索引节点号。
9. 删除目录,rmdir命令
删除目录的基本命令是rmdir
[root@iZbp114fcr9i7o48lvhommZ home]# rmdir dir1
[root@iZbp114fcr9i7o48lvhommZ home]# rmdir /cp2
rmdir: failed to remove '/cp2': Directory not empty
默认情况下,rmdir命令只删除空目录,但在/cp2目录中有文件,所以rmdir没有删除它
如果真想删除一个非空目录,可以使用rm -r递归地删除目录中的文件,最后删除目录自身
[root@iZbp114fcr9i7o48lvhommZ home]# rm -r /cp2
rm: descend into directory '/cp2'? y
rm: descend into directory '/cp2/cp'? y
rm: remove regular empty file '/cp2/cp/test1'? y
rm: remove directory '/cp2/cp'? y
rm: remove regular empty file '/cp2/test1'? y
rm: remove regular empty file '/cp2/test2'? y
rm: remove regular empty file '/cp2/test3'? y
rm: remove directory '/cp2'? y
[root@iZbp114fcr9i7o48lvhommZ home]# ls -il /cp2
ls: cannot access '/cp2': No such file or directory
[root@iZbp114fcr9i7o48lvhommZ home]#
此种方法虽然可行,但很难用。故可以用省心而惯用的终极办法是使用rm命令,并加上参数-r和-f:
[root@iZbp114fcr9i7o48lvhommZ home]# rm -rf dir4
[root@iZbp114fcr9i7o48lvhommZ home]# ls -il dir4
ls: cannot access 'dir4': No such file or directory
就这么简洁,既没有警告,也没有一大堆问题,但是非常危险,谨慎使用!!!!!!
10. 查看文件(cat,more,less)
如果手头有有一个很大的文件,比如nginx访问日志文件或tomcat日志文件,你可能需要查看里面的内容进行定位排查,有三个命令可以完成这个任务。
10.1 cat命令
cat 命令是显示文本文件中所有数据的得力工具。
日志文件
[root@iZbp114fcr9i7o48lvhommZ home]# cd tomcat-logs/
[root@iZbp114fcr9i7o48lvhommZ tomcat-logs]# ll
total 764
-rw-r--r-- 1 root root 49013 Oct 2 00:07 catalina.2020-04-17.log
-rw-r--r-- 1 root root 297132 Oct 2 00:07 catalina.2020-04-21.log
-rw-r--r-- 1 root root 27085 Oct 2 00:07 catalina.2020-08-15.log
-rw-r--r-- 1 root root 218045 Oct 2 00:06 error.log
-rw-r--r-- 1 root root 102630 Oct 2 00:06 error.log.2020-08-15
-rw-r--r-- 1 root root 0 Oct 2 00:07 host-manager.2020-04-17.log
-rw-r--r-- 1 root root 0 Oct 2 00:07 host-manager.2020-04-21.log
-rw-r--r-- 1 root root 0 Oct 2 00:07 host-manager.2020-08-15.log
-rw-r--r-- 1 root root 55898 Oct 2 00:06 info.log
-rw-r--r-- 1 root root 0 Oct 2 00:07 info.log.2020-08-15
-rw-r--r-- 1 root root 924 Oct 2 00:07 localhost.2020-04-17.log
-rw-r--r-- 1 root root 462 Oct 2 00:07 localhost.2020-04-21.log
-rw-r--r-- 1 root root 462 Oct 2 00:07 localhost.2020-08-15.log
-rw-r--r-- 1 root root 1760 Oct 2 00:07 localhost_access_log.2020-04-17.txt
-rw-r--r-- 1 root root 0 Oct 2 00:07 localhost_access_log.2020-04-21.txt
-rw-r--r-- 1 root root 745 Oct 2 00:07 localhost_access_log.2020-08-15.txt
-rw-r--r-- 1 root root 0 Oct 2 00:07 manager.2020-04-17.log
-rw-r--r-- 1 root root 0 Oct 2 00:07 manager.2020-04-21.log
-rw-r--r-- 1 root root 0 Oct 2 00:07 manager.2020-08-15.log
[root@iZbp114fcr9i7o48lvhommZ tomcat-logs]# cat catalina.2020-08-15.log
°̔ 15, 2020 7:38:28 Ђϧ org.apache.catalina.startup.VersionLoggerListener log
хϢ: Server version: Apache Tomcat/7.0.77
°̔ 15, 2020 7:38:29 Ђϧ org.apache.catalina.startup.VersionLoggerListener log
хϢ: Server built: Mar 28 2017 16:01:48 UTC
°̔ 15, 2020 7:38:29 Ђϧ org.apache.catalina.startup.VersionLoggerListener log
хϢ: Server number: 7.0.77.0
°̔ 15, 2020 7:38:29 Ђϧ org.apache.catalina.startup.VersionLoggerListener log
хϢ: OS Name: Windows 7
°
没什么特别的,只是文本文件的内容,但是对于大型文件来说,cat很繁琐,内容会一闪而过,故引出了more命令
、10.2 more命令
more命令区别于cat命令,它会显示文本文件的内容,但会在显示每页数据之后停下来,
[2020-08-16 00:18:35 ]:ERROR Context initialization failed
org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 51 in XML document from class path resource [spring-mvc.xml] is in
valid; nested exception is org.xml.sax.SAXParseException; lineNumber: 51; columnNumber: 22; The prefix "mvc" for element "mvc:interceptors" is
not bound.
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:402)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:338)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:310)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:224)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:195)
at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125)
at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94)
at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.
java:130)
at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:638)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:523)
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:702)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:668)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:716)
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:591)
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:530)
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:170)
at javax.servlet.GenericServlet.init(GenericServlet.java:158)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1269)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1182)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1072)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5368)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5660)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1571)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1561)
at java.util.concurrent.FutureTask.run(Unknown Source)
--More--(1%)
注意在显示结果底部,more命令显示了一个标签,说明你仍在more程序中,以及现在在这个文本文件中的位置,这是more命令的提示符。
10.3 less命令
自行查阅资料,我没怎么用过
11. 查看部分文件
通常用户要查看的数据要么在文本文件的开头,要么在文本文件的末尾。如果这些数据是在一个大型文件中,那你就得等cat或more加载完整个文件之后才能看到内容。如果数据是在文件的末尾(比如日志文件),你可能需要翻成千上万行的文本才能看到最后的内容。好在linux有解决这两个问题的专用命令。
11.1 tail命令
tail命令会显示文件末尾部分的内容(默认情况下它会显示文件的末尾10行,你也可以通过参数来指定显示的行数)
[root@iZbp114fcr9i7o48lvhommZ tomcat-logs]# tail -n 20 error.log
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [spring.xml]: Invocation of init method failed; nested exception is java.lang.AbstractMethodError: javax.xml.parsers.DocumentBuilderFactory.setFeature(Ljava/lang/String;Z)V
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1794)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:516)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:324)
at org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$45/543288888.getObject(Unknown Source)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:330)
... 39 more
Caused by: java.lang.AbstractMethodError: javax.xml.parsers.DocumentBuilderFactory.setFeature(Ljava/lang/String;Z)V
at org.apache.ibatis.parsing.XPathParser.createDocument(XPathParser.java:234)
at org.apache.ibatis.parsing.XPathParser.<init>(XPathParser.java:127)
at org.apache.ibatis.builder.xml.XMLConfigBuilder.<init>(XMLConfigBuilder.java:82)
at org.mybatis.spring.SqlSessionFactoryBean.buildSqlSessionFactory(SqlSessionFactoryBean.java:517)
at org.mybatis.spring.SqlSessionFactoryBean.afterPropertiesSet(SqlSessionFactoryBean.java:490)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1853)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1790)
... 47 more
显示日志文件的最后20行
11.2 head命令
它会显示文件开头那些行的内容,默认情况下,显示文件前十行的文本。
[root@iZbp114fcr9i7o48lvhommZ tomcat-logs]# head -n 5 error.log
[2020-08-16 00:18:35 ]:ERROR Context initialization failed
org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 51 in XML document from class path resource [spring-mvc.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 51; columnNumber: 22; The prefix "mvc" for element "mvc:interceptors" is not bound.
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:402)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:338)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:310)
[
显示日志前5行。
12. 文件查找,find命令
find是linux命令行工具箱中最棒的工具之一,它的工作方式如下:沿着文件层次结构向下遍历,匹配符合条件的文件,并执行相应的操作。格式如下: find 搜索目录名 条件参数操作。我就举例我经常用的案例
12.1 根据具体文件名匹配搜索
[root@iZbp114fcr9i7o48lvhommZ tomcat-logs]# find . -name dgm.png -print
./dgm.png
[root@iZbp114fcr9i7o48lvhommZ tomcat-logs]#
选项-name的参数指定了文件名所必须匹配的字符串,选项-print在终端中打印出符合条件的文件名或文件路径,这些匹配条件作为find命令的选项给出。我们也可以通过通配符作为参数使用,比如*.txt能够匹配所有以.txt结尾的文件名。
[root@iZbp114fcr9i7o48lvhommZ tomcat-logs]# find . -name "*.txt" -print
./localhost_access_log.2020-04-17.txt
./localhost_access_log.2020-04-21.txt
./localhost_access_log.2020-08-15.txt
find命令有一个选项-iname(忽略字母大小写),该选项的作用和-name类似,只不过在匹配名字的时候会忽略大小写。
[root@iZbp114fcr9i7o48lvhommZ tomcat-logs]# find . -iname "error*" -print
./error.log
./error.log.2020-08-15
./ERROR.LOG
如果想匹配多个条件中的一个,可以采用or条件操作。
[root@iZbp114fcr9i7o48lvhommZ tomcat-logs]# find . \( -name "*.txt" -o -name "*.pdf" \) -print
./localhost_access_log.2020-04-17.txt
./localhost_access_log.2020-04-21.txt
./localhost_access_log.2020-08-15.txt
./jsr-250.pdf
上面的代码会打印出所有的txt和pdf文件。
12.2 根据正则表达式匹配搜索
正则表达式是通配符匹配的高级形式,它可以指定文本模式。
[root@iZbp114fcr9i7o48lvhommZ tomcat-logs]# find . -regex ".*\.png$"
./Java-Beans.png
./dgm.png
表示匹配.png的文件。
12.3 否定参数
find也可以用"!"否定参数的含义。
[root@iZbp114fcr9i7o48lvhommZ tomcat-logs]# find . ! -name "*.log" -print
.
./error.log.2020-08-15
./info.log.2020-08-15
./localhost_access_log.2020-04-17.txt
./localhost_access_log.2020-04-21.txt
./localhost_access_log.2020-08-15.txt
./INFO.LOG
./ERROR.LOG
./Java-Beans.png
./?ղ?.doc
./Stuct2.jpg
./dgm.jpg
./dgm.png
./jsr-250.pdf
./ͨѶ¼.xls
./db.properties
./menu.json
上面的find命令能够匹配所有不以.log结尾的文件名。
12.4 根据文件类型搜索
文件具有不同的类型,例如普通文件、目录、字符设备、块设备、符号链接、硬链接、套接字等。
-type参数可以对文件进行搜索,借助这个选项,我们可以为find命令指明特定的文件匹配类型。
只列出所有的目录,如下
[root@iZbp114fcr9i7o48lvhommZ tomcat-logs]# find . -type d -print
.
./dir1
./dir2
./dir3
只列出所有的普通文件
[root@iZbp114fcr9i7o48lvhommZ tomcat-logs]# find . -type f -print
./error.log
./error.log.2020-08-15
./info.log
./info.log.2020-08-15
./catalina.2020-04-17.log
./catalina.2020-04-21.log
.
只列出符号链接
[root@iZbp114fcr9i7o48lvhommZ tomcat-logs]# ln -s /usr/bin/python3 /home/tomcat-logs/python3
[root@iZbp114fcr9i7o48lvhommZ tomcat-logs]# find . -type l -print
./python3
12.5 根据文件时间进行搜索
linux文件系统中的每一个文件都有三种时间戳:访问时间、修改时间、变化时间。
访问时间(-atime):用户最近一次访问文件的时间。
修改时间(-utime):文件内容最后一次被修改的时间。
变化时间(-ctime):文件元数据(比如权限或所有权)最后一次改变的时间。
-atime、-utime、-ctime可以作为find的时间参数。它们可以整数值输出,单位是天。这些整数值通常带有-或+:-表示小于,+表示大于。
打印出在最近三天内被访问过的所有文件:
[root@iZbp114fcr9i7o48lvhommZ tomcat-logs]# find . -type f -atime -3 -print
./error.log
./error.log.2020-08-15
./info.log
./info.log.2020-08-15
.
打印出恰好在三天前被访问过的所有文件:
[root@iZbp114fcr9i7o48lvhommZ tomcat-logs]# find . -type f -atime 3 -print
./error.log
./error.log.2020-08-15
./info.log
./info.log.2020-08-15
.
打印出访问时间超过3天的所有文件:
[root@iZbp114fcr9i7o48lvhommZ tomcat-logs]# find . -type f -atime +3 -print
./error.log
./error.log.2020-08-15
./info.log
./info.log.2020-08-15
.
12.6 基于文件大小的搜索,很实用
根据文件的大小,可以这样搜索
搜索大于50KB的文件
[root@iZbp114fcr9i7o48lvhommZ tomcat-logs]# find . -type f -size +50k -print
./error.log
./error.log.2020-08-15
./info.log
./catalina.2020-04-21.log
./Java-Beans.png
搜索小于50KB的文件
[root@iZbp114fcr9i7o48lvhommZ tomcat-logs]# find . -type f -size -50k -print
./info.log.2020-08-15
./catalina.2020-04-17.log
./catalina.2020-08-15.log
大小等于1KB的文件
[root@iZbp114fcr9i7o48lvhommZ tomcat-logs]# find . -type f -size 1k -print
./localhost.2020-04-17.log
./localhost.2020-04-21.log
./localhost.2020-08-15.log
文件大小除了单位k之外,还可以使用其他文件大小单元,比如M兆字节、G字节等。
12.7 基于文件权限和所有权的匹配
文件匹配可以根据文件权限进行。列出具有特定权限的所有文件,例如打印出权限为644的文件
[root@iZbp114fcr9i7o48lvhommZ tomcat-logs]# find . -type f -perm 644 -print
./error.log
./error.log.2020-08-15
./info.log
......
打印出权限为777的链接:
[root@iZbp114fcr9i7o48lvhommZ tomcat-logs]# find . -type l -perm 777 -print
./python3
也可以根据文件的所有权进行搜索,用选项-user USER就能够找出由某个特定用户所拥有的文件,参数USER可以是用户名或用户uid。例如打印出用户jpadmin拥有的所有文件:
[root@iZbp114fcr9i7o48lvhommZ home]# find . -type f -user jpadmin -print
./jpadmin/.local/share/jupyter/runtime/nbserver-47194.json
./jpadmin/.local/share/jupyter/runtime/nbserver-47194-open.html
./jpadmin/.local/share/jupyter/runtime/kernel-12440f83-9e3c-42a8-9f05-7fbc3ef8da79.json
./jpadmin/.local/share/jupyter/runtime/kernel-4346473e-0042-4d61-a52c-6c6d352e4eef.json
./jpadmin/.local/share/jupyter/runtime/nbserver-1324.json
./jpadmin/.local/share/jupyter/runtime/nbserver-1324-open.html
./jpadmin/.local/share/jupyter/runtime/kernel-50b369b9-fd31-436e-acdd-c6992e1977c3.json
./jpadmin/.local/share/jupyter/runtime/kernel-1317e96f-35de-4f36-8513-09d3a46a93bc.json
./jpadmin/.local/share/jupyter/nbsignatures.db
./jpadmin/.local/share/jupyter/notebook_secret
./jpadmin/.ipython/profile_default/startup/README
./jpadmin/.ipython/profile_default/history.sqlite
./jpadmin/.cache/matplotlib/fontlist-v330.json
./jpadmin/.jupyter/migrated
12.8 删除匹配的文件
-delete参数可以用来删除find查找到的匹配文件。
例如删除当前目录下所有以.txt结尾的文件:
[root@iZbp114fcr9i7o48lvhommZ tomcat-logs]# find . -type f -name "*.txt" -print
./localhost_access_log.2020-04-17.txt
./localhost_access_log.2020-04-21.txt
./localhost_access_log.2020-08-15.txt
[root@iZbp114fcr9i7o48lvhommZ tomcat-logs]# find . -type f -name "*.txt" -delete
[root@iZbp114fcr9i7o48lvhommZ tomcat-logs]# find . -type f -name "*.txt" -print
[root@iZbp114fcr9i7o48lvhommZ tomcat-logs]#
空空如也。
12.9 结合find执行命令或动作
find命令可以借助选项-exec与其他命令相结合。
-rw-r--r-- 1 root root 745536 Oct 2 11:45 jsr-250.pdf
[root@iZbp114fcr9i7o48lvhommZ tomcat-logs]# find . -type f -name "*.pdf" -exec chown jpadmin {} \;
[root@iZbp114fcr9i7o48lvhommZ tomcat-logs]# ls -l
-rw-r--r-- 1 jpadmin root 745536 Oct 2 11:45 jsr-250.pdf
在这个命令中,{}是一个特殊的字符串,与-exec选项结合使用。对于每一个匹配的文件,{}会被替换成相应的文件名。
注意:此时pdf文件的所有者已是jpadmin了。
我们无法在-exec参数中直接使用多个命令,它只能接受单个命令,不过我们可以把多个命令写到一个shell脚本中,然后在exec中使用这个脚本:-exec 脚本名称 {} \;
当然find命令还有其他操作参数,就不一一举例了。
由于篇幅有限且命令很多几十个,我就分开回忆编写了,注如果你们不是使用linux,那就可以略过此文和后续了。
待续。。。。。。
参考:
-
50 Basic Linux Commands for Beginners https://www.technicalmint.com/linux/basic-linux-commands-for-beginners/
-
Basic Commands http://www.linuxbasics.in/basic-commands/
-
Find Command http://www.linuxbasics.in/find-command/
-
Filter Commands:http://www.linuxbasics.in/filter-commands/
-
Top 101 Linux Interview Questions And Answers 2020 https://www.thetechlearn.com/linux-interview-questions/
-