前言
本文及接下来的几篇文章主要来学习下Linux服务器操作中的常用命令,使用系统版本是:CentOS 7.4.17.08
。 本文主要学习的Linux命令有:netstat,tail,head,cat,tac,less,more,pwd,cd,ls,type,which,touch,nl,mkdir,rmdir。
1. netstat命令
netstat命令用于显示各种网络相关信息,比如IP、TCP、UDP和ICMP协议的统计信息,网络连接,接口统计等,在工作中使用很多的一种情况是检查本机各端口的连接情况。比如新加一个服务,查看某个端口是否被占用,端口被哪个进程占用等。
看一下它的常用的参数:
-a 或 –-all: 显示所有连线中的Socket
-t 或 --tcp:显示TCP传输协议的连线状况;
-u 或 --udp:显示UDP传输协议的连线状况;
-h 或 --help:在线帮助;
-l 或 --listening:显示监控中的服务器的Socket;
-p 或 –-programs: 显示正在使用Socket的进程id和进程名称;、
-n 或 -–numeric: 隐藏主机,端口,用户名,如果在我们的netstat中不想展示这些信息,可以使用这个命令进行隐藏
使用例子:
[root@192 ~]$ netstat -a # 列出所有端口
[root@192 ~]$ netstat -at # 列出所有TCP端口
[root@192 ~]$ netstat -au # 列出所有UDP端口
比如我们可以查看某个端口是否被占用,以及被哪个服务所占用(可通过PS命令):
[root@192 ~]$ netstat -autlp|grep 端口号
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:sunrpc 0.0.0.0:* LISTEN 1/systemd
tcp 0 0 192.168.122.1:domain 0.0.0.0:* LISTEN 3197/dnsmasq
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN 1364/sshd
tcp 0 0 localhost:ipp 0.0.0.0:* LISTEN 1362/cupsd
tcp 0 0 192.168.1.7:51532 210.32.158.231:http ESTABLISHED 15646/python
这里可能需要注意下,有些进程有些时候可能会找不到,这时候注意下当前登陆用户的权限,因为并不是所有用户都是root权限。
有关该命令的更多参数了解及使用可参考:
每天一个linux命令(56):netstat命令
netstat命令详解
2. tail命令
tail是尾部的意思,就是循环将指定的文件的最后部分输出到标准设备,通常是终端。通俗的说,就是将某个文件的最后几行显示到终端上,如果该文件有更新,tail会自动刷新,确保看到的是最新的。这个命令一般用于我们进行查看日志。
使用格式:
tail [ -f ] [ -c Number | -n Number | -m Number | -b Number | -k Number ] [ File ]
常用参数:
-f 循环读取
-c<数目num> 从尾部num某字节位置读取
-n<行数num> 从尾部多少行读取
-b<数目num> 从尾部num表示的512字节块位置读取
-k<数目num> 从尾部num表示的1KB块位置读取
这其中都涉及到参数num,如果不指定的话,默认显示10行,该参数前面可以使用正负号,表示该偏移从顶部还是从尾部开始计算,如果不指定正负号,默认是负号,从尾部开始计算。
简单的例子:
[root@192 ~]$ tail -f catalina.out # 打印最后10行日志,然后循环执行
[root@192 ~]$ tail -n 20 catalina.out # 打印日志的最后20行
[root@192 ~]$ tail -n +20 catalina.out # 从第20行开始打印日志
如果有需要,可使用 tail --help
查询全部命令。
3. head 命令
head命令和tail命令是相对应的,tail用于从尾部展示数据,而head则是从头部开始展示数据。
常用参数:
-c<数目num> 读取前num字节数据
-n<行数num> 读取前多少行数据
-v:显示文件名信息
-q:隐藏文件名信息
同样,默认情况下,head命令也是只展示10行数据,num为正数,表示读取前多少行,为负数,表示读取倒数多少行之前的数据,默认是正数。比如num为3,+3表示读取前3行,-3表示读取从开始到倒数第三行的数据。
举个简单的例子,新建test.log
,文件内容:
test1
test2
test3
test4
test5
test6
test7
test8
test9
test10
举例1:分别使用+num 和 -num来测试,默认是+num,也就是前几行
[mrzhang@192 zhangkeke]$ head -n +3 test.log
test1
test2
test3
[mrzhang@192 zhangkeke]$ head -n -3 test.log
test1
test2
test3
test4
test5
test6
test7
举例2:使用-v 和 -q 显示和隐藏文件名,默认是隐藏文件名
[mrzhang@192 zhangkeke]$ head -v test.log
==> test.log <==
test1
test2
... 省略
test9
test10
[mrzhang@192 zhangkeke]$ head -q test.log
test1
test2
... 省略
test9
test10
4. cat命令
cat命令的功能很多,我们来看它几个常用的功能。
cat [file]
,查看文件内容,查看全部;也可以根据关键字查询;
[mrzhang@192 zhangkeke]$ cat test.log # 查看文件全部内容
[mrzhang@192 zhangkeke]$ cat test.log | grep 20 # 将查询文件中包含20的内容
- 创建文件,如果文件已存在,则是编辑文件,会覆盖掉原有的文件内容;如果有需要的话,可以使用该命令进行清空文件内容;
[mrzhang@192 zhangkeke]$ cat >test2.log << EOF
> 0519
> 0520
> EOF
[mrzhang@192 zhangkeke]$ cat test2.log
0519
0520
通过EOF来告诉bash哪个符号代表文件结束,当然我们也可也使用其他的符号。
- 将几个文件合并为一个文件;
[mrzhang@192 zhangkeke]$ cat test.log test2.log > test3.log
- 向原来文件的尾部写入内容;与上面创建编辑文件类似,只需要将原来的 > 换成 >>即可;
[mrzhang@192 zhangkeke]$ cat >>test.log <<EOF
- 写入内容的时候,对 符号是特殊变量,如果直接写该符号,有可能被认为要调用系统变量,所以需要使用
\
进行转义下:
[mrzhang@192 zhangkeke]$ cat >test.log <<EOF
> DATE=$(date)
> EOF
[mrzhang@192 zhangkeke]$ cat test.log
DATE=Sat May 19 21:48:19 CST 2018
[mrzhang@192 zhangkeke]$ cat >test.log <<EOF
> DATE=\$(date)
> EOF
[mrzhang@192 zhangkeke]$ cat test.log
DATE=$(date)
然后,再来看一下常用的参数:
-n 或 --number:由 1 开始对所有输出的行数编号。
-b 或 --number-nonblank:和 -n 相似,只不过对于空白行不编号
-s 或 --squeeze-blank:当遇到有连续两行以上的空白行,就代换为一行的空白行
比如,把 textfile1 的文档内容加上行号后输入 textfile2 这个文档里:
[mrzhang@192 zhangkeke]$ cat -n textfile1 > textfile2
更多可参考:Linux cat命令
5. tac命令
tac命令是和cat命令是对应的,cat反过来就是tac,功能就是把文件内容反过来显示,以行为单位,文件的最后一行先显示,第一行最后显示,先瞅下:
[mrzhang@192 zhangkeke]$ cat test2.log
0519
0520
0521
[mrzhang@192 zhangkeke]$ tac test2.log
0521
0520
0519
这个命令一般使用的不多,在网上看到使用tac命令的一种情况,查看日志,如果日志很多的话,使用tail不太方便,使用less翻页太多,使用cat会从前往后,这时候可以考虑使用tac命令:
[mrzhang@192 zhangkeke]$ tac xx.log | grep -m2 -C2 abc
grep -m 搜索的结果个数设置, -C(大写) 搜索结果的旁边n行输出;
6. less命令
less命令作为Linux比较正式的查看文件内容的工具,功能及其强大,不但支持分页查查,还有很强大的搜索功能。我们先来看一下它的参数:
-b <缓冲区大小> 设置缓冲区的大小
-e 当文件显示结束后,自动离开
-g 只标志最后搜索的关键词
-i 忽略搜索时的大小写
-m 显示类似more命令的百分比
-N 显示每行的行号
-o <文件名> 将less 输出的内容在指定文件中保存起来
-s 显示连续空行为一行
- less命令的强大不在于这些参数,而在于使用less命令打开文件后,类似于vi快捷键的导航命令。我们在使用less命令打开文件后,可以使用以下一些导航命令进行操作:
G 快速定位到最后一行(方便我们查看日志)
g 快速定位到第一行
q/ZZ 退出less命令
k 向上移动一行
j 向下移动一行
f 向下移动一屏或者说向后移动一屏
b 向上移动一屏或者说向前移动一屏
d 向下移动半屏
u 向上移动半屏
v/vi 编辑该文件
空格 向下移动一屏
回车 向下移动一行
- 另外,就是搜索的导航命令,这个功能十分强大,可以用于我们查看日志等相关的操作,主要搜索方式有下面两种(搜索正则表达式):
/ 向后搜索(向下搜索),适合从文件的头部往后搜索
n 向后查找下一个匹配的
N 向前查找下一个匹配的
? 向前搜索(向上搜索),适合从文件的尾部往前搜索
n 向前查找下一个匹配的
N 向后查找下一个匹配的
= 显示当前行信息,如行号、字节位置等
对于第二种?
这种形式的我们使用的比较多,因为查看异常日志的时候,我们一般都是查看最后一次exception,然后以此往前进行查询。可以简单看下 =
等号这个导航命令:
test3.log lines 17-39/81 byte 119/185 64% (press RETURN)
- 另外,当使用 less 查看大文件时,可以在任何一个位置作标记,然后可以通过命令导航到标有特定标记的文本位置:
ma 使用 a 标记文本的当前位置
'a 导航到标记 a 处
标记的时候,输入 m
后,弹出 mark:
,然后输入a
标记文本的当前位置,而要导航到标记的位置的话,先输入'
,然后弹出 goto mark:
,输入a
导航到标记处;
- 除此之外,less命令还支持同时浏览多个文件:
- 第一种,直接less 多个文件,就可以浏览多个文件:(默认先展示第一个)
[mrzhang@192 zhangkeke]$ less test.log test3.log
- 第二种,浏览一个文件时,使用
:e
打开另一个文件:
[mrzhang@192 zhangkeke]$ less test.log
输入 :e
之后:
Examine:
输入另一个文件的地址及名称就可以了。而当打开多个文件时,可以使用如下命令在多个文件之间切换:
:n 浏览下一个文件
:p 浏览前一个文件
- 直接定位到某个位置:
[mrzhang@192 zhangkeke]$ less +17g xxx.log # 定位到第17行
[mrzhang@192 zhangkeke]$ less +G xxx.log # 定位到最后一行
[mrzhang@192 zhangkeke]$ less +100P xxx.log # 定位到第100个字节的位置
由于该命令功能十分强大,参数及导航命令特别多,如果有需要,可以使用less --help
查看该命令的全部使用参数。
7. more命令
该命令和cat命令有点像,cat显示数据的时候是显示全部,而more则是分页展示,并且还具有字符串搜索的功能,more命令也是从前往后读取文件。来看一下它的参数:
+num 从笫num行开始显示
-num 一次显示num行
-s 把连续的多个空行显示为一行
同样,使用more命令打开文件后,可以使用如下导航命令进行一些操作:
空格键 显示下一屏
换行键 显示下一行
nf 向下移动n屏,其中n是数字
nb 向上移动n屏,其中n是数字
/ 向下查找指定的字符串模式
n 向后查找下一个匹配的
= 显示当前的行号
q 退出
并且,more和less也很像,支持同时浏览多个文件,同样是使用:n
,:p
来实现,并且还有许多其他相似的功能,实际工作中该命令使用的比less命令要少一点,如果感兴趣的可以使用它的help命令进行查看;
有时候我们可能会用到这个命令,比如如果一个目录下文件过多,我们可以使用more然后结合管道 | 来进行分页展示:
[mrzhang@192 zhangkeke]$ ll | more -5
8. pwd命令
pwd 命令比较简单,就是来查看当前所在目录的完整路径,当我们不太确定当前的确切路径时,就可以使用该命令来进行查看。
[mrzhang@192 zhangkeke]$ pwd
/home/mrzhang/Documents/zhangkeke
参数:
-L 如果目录是一个软链的话,显示链接路径
-P 显示实际的物理路径
如果一同使用的话,以第一个参数的为准,来看一下:
[mrzhang@192 etc]$ cd /etc/init.d/
[mrzhang@192 init.d]$ pwd
/etc/init.d
[mrzhang@192 init.d]$ pwd -L
/etc/init.d
[mrzhang@192 init.d]$ pwd -P
/etc/rc.d/init.d
[mrzhang@192 init.d]$ pwd -LP
/etc/rc.d/init.d
[mrzhang@192 init.d]$ pwd -PL
/etc/init.d
不过大多数情况下,我们使用该命令时,都无需传递参数。pwd
的命令其实不仅是shell的一个命令,在当前版本中,还有两个可执行pwd
的路径:
[mrzhang@192 zhangkeke]$ type -a pwd
pwd is a shell builtin
pwd is /usr/bin/pwd
pwd is /bin/pwd
还可以查看一下pwd
命令的版本:
[mrzhang@192 zhangkeke]$ /usr/bin/pwd --version
pwd (GNU coreutils) 8.22
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http: gnu="gnu">.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Jim Meyering.
9. cd命令
cd命令是linux中最基础的命令,表示进入另一个目录或者说切换当前目录到另一个目录,命令格式:cd [目录]
。
[mrzhang@192 zhangkeke]$ cd / #进入系统根目录
[mrzhang@192 zhangkeke]$ cd ../ #返回上一层目录,也可以是 cd ..
[mrzhang@192 zhangkeke]$ cd ../../ #返回上级的上级目录,可以多层
[mrzhang@192 zhangkeke]$ cd #进入当前用户主目录,也可以是 cd ~
[mrzhang@192 zhangkeke]$ cd /etc/ #跳转至指定目录,从根目录开始
[mrzhang@192 zhangkeke]$ cd - #返回进入此目录之前所在的目录
[mrzhang@192 zhangkeke]$ cd !$ #把上个命令的最后一个单词作为cd 的参数
针对最后一个cd !$
简单说下,!$
表示最近执行的一条命令的最后一个单词。如果上一条执行的命令是ls
,那么cd !$
就表示cd ls
;如果上一条执行的命令是cd /root
,那么这里执行的就是cd /root
;当然除非最近的命令与目录有关,否则该命令都会执行不了。
本文参考自:每天一个linux命令(2):cd命令
10. ls命令
这个命令也是我们最常见到的命令了,用于打印当前目录下的文件及文件夹内容,我们直接来看一下参数:
ls 目录 列出该目录下的文件
ls -a 显示全部文件,包括隐藏文件(使用.开头)
ls -A 显示全部文件,但不包含.(当前目录) 和 ..(当前目录的父目录)
ls -l 显示全部文件(不包含隐藏文件),并且展示文件的权限,修改日期,文件大小等
ls -t 按照修改时间排序(新的在前面)
ls -r 对原有顺序进行反序
ls -R 对原有顺序反序,同时递归列出所有子目录
ls -h 以比较容易理解的格式列出文件大小 (如 1K 1.4k)
ls -F 显示目录的时候,会在每个目录的末尾添加/字符
ls -S 以文件大小来降序排序
ls -i 列出文件或目录的索引节点号
ls --version 显示ls命令的版本
ls --help 帮助页面,查看所有参数
我们来看几个简单的例子:
- 查看当前目录中所有以
test
开头的文件的详细内容:
- 查看当前目录中所有以
[mrzhang@192 zhangkeke]$ ls -l test*
- 以修改时间排序展示文件,最新的排在后面:
[mrzhang@192 zhangkeke]$ ls -ltr
- 按照文件大小进行降序排列:
[mrzhang@192 zhangkeke]$ ls -lR
- 通过
alias
给ls设置别名,这样我们就可以使用别名来进行操作,我们先通过不加任何参数的alias命令来查看所有可用的alias配置,当然也可以通过unalias
来取消:
- 通过
[mrzhang@192 ~]$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
这里,我们可以看到我们平时使用的ll
命令其实就是ls -l
命令的别名,当然我们也可以自定义我们自己的实现:
[mrzhang@192 ~]$ unalias ll
[mrzhang@192 ~]$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ls='ls --color=auto'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[mrzhang@192 ~]$ ll
bash: ll: command not found...
[mrzhang@192 ~]$ alias ll='ls -l'
[mrzhang@192 ~]$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l'
alias ls='ls --color=auto'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
这里我们只列举了常用的一些参数,同样,更多参数可以参考ls --help
和man ls
来学习。
本文参考自:https://linux.cn/article-5109-1.html
11. type命令
type命令用来显示我们要查询的命令的类型,比如说我们的命令是内部命令还是外部命令,而命令的类型大致有如下几种:
alias 命令的别名
keyword 关键字,Shell保留字
function 函数,Shell函数
builtin Shell内建命令
file 文件,磁盘文件,外部命令
unfound 没有找到该命令
格式是:type 参数 命令
,常用的几个参数:
type -t 返回命令的类型,返回 builtin,代表是内部命令,返回file,代表是外部命令等;
type -p 返回外部命令信息,显示其绝对路径;
type -f 显示shell函数相关命令;
type -a 显示所有的命令类型;
来看一下简单的例子:
[mrzhang@192 ~]$ type ll
ll is aliased to `ls -l'
[mrzhang@192 ~]$ type cd
cd is a shell builtin
[mrzhang@192 ~]$ type date
date is /usr/bin/date
[mrzhang@192 ~]$ type not
bash: type: not: not found
[mrzhang@192 ~]$ type man
man is hashed (/usr/bin/man)
[mrzhang@192 ~]$ type -t cd
builtin
[mrzhang@192 ~]$ type -t ls
alias
[mrzhang@192 ~]$ type -a time
time is a shell keyword
time is /usr/bin/time
time is /bin/time
[mrzhang@192 ~]$ type -p time
[mrzhang@192 ~]$ type -f time
time is a shell keyword
[mrzhang@192 ~]$ type -t time
keyword
12. which命令
which命令是用来查找命令的,which命令会在环境变量$PATH指定的路径中,查找某个给定命令的位置,并返回第一个查找到的结果,也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。
[mrzhang@192 ~]$ which pwd
/usr/bin/pwd
[mrzhang@192 ~]$ which ll
alias ll='ls -l'
/usr/bin/ls
[mrzhang@192 ~]$ which ddddd
/usr/bin/which: no ddddd in (/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/mrzhang/.local/bin:/home/mrzhang/bin)
[mrzhang@192 ~]$ which -v
GNU which v2.20, Copyright (C) 1999 - 2008 Carlo Wood.
GNU which comes with ABSOLUTELY NO WARRANTY;
This program is free software; your freedom to use, change
and distribute this program is protected by the GPL.
13. touch命令
touch命令比较简单,主要用于两种场景,一种是新建不存在的文件,另一种是修改文件或者目录的时间属性;
-a 只更改文件的访问时间(access time);
-m 只更改文件的修改时间(modification time);
-c --no-create 不创建任何文件;
-d --date=STRING 使用指定的日期时间,而非现在的时间,使用字符串的形式;
-t 使用指定的日期时间,而非现在的时间,格式是 [[CC] YY]MMDDhhmm[.ss]
-f 此参数将忽略不予处理,仅负责解决BSD版本touch指令的兼容性问题;
-r 把指定文档或目录的日期时间,统统设成和参考文档或目录的日期时间相同;
这里简单说下,Linux的文件不同于我们Windows系统中的文件,Windows中文件有创建时间,而Linux中的文件并没有创建时间的概念,Linux中的文件有三个时间:该文件的访问时间,修改时间,状态改变时间。
- 访问时间:每读一次该文件的内容,该时间就会更新一次,比如使用cat命令;
- 修改时间:对文件修改一次,该时间就会更新一次,比如 vi命令 修改,而我们使用
ll
列出的时间就是这个时间;- 状态改变时间:该文件的属性发生了改变,该时间就会更新一次,比如通过chmod命令更改之后,这个时间就会更新。
- 如果要查看文件的这几个时间,可以通过stat命令来查看。
下面,我们还是通过几个简单的例子来学习下该命令:
- 创建一个新的文件。我们新建一个test目录来进行测试:
[mrzhang@192 Documents]$ cd test/
[mrzhang@192 test]$ ls
[mrzhang@192 test]$ touch test.log
[mrzhang@192 test]$ ll
total 0
-rw-rw-r--. 1 mrzhang mrzhang 0 Jun 10 11:16 test.log
[mrzhang@192 test]$ touch test.log
[mrzhang@192 test]$ ll
total 0
-rw-rw-r--. 1 mrzhang mrzhang 0 Jun 10 11:16 test.log
当然,我们也可以同时创建多个文件:
[mrzhang@192 test]$ touch test1.log test3.log
- 更改某一个文件的修改时间和另一个时间相同。命令格式是:
touch -r file1 file2
,将file2的时间修改为和file1的一样:
- 更改某一个文件的修改时间和另一个时间相同。命令格式是:
[mrzhang@192 test]$ touch test2.log
[mrzhang@192 test]$ ll
total 0
-rw-rw-r--. 1 mrzhang mrzhang 0 Jun 10 11:21 test2.log
-rw-rw-r--. 1 mrzhang mrzhang 0 Jun 10 11:16 test.log
[mrzhang@192 test]$ touch -r test.log test2.log
[mrzhang@192 test]$ ll
total 0
-rw-rw-r--. 1 mrzhang mrzhang 0 Jun 10 11:16 test2.log
-rw-rw-r--. 1 mrzhang mrzhang 0 Jun 10 11:16 test.log
- 使用-d 修改文件的时间为指定的时间。先使用stat命令查看下文件的时间,然后修改文件的时间,再修改文件的日期加时间(备注:隐藏了一些打印内容):
[mrzhang@192 test]$ stat test.log
File: ‘test.log’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd02h/64770d Inode: 2262 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ mrzhang) Gid: ( 1000/ mrzhang)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2015-12-11 09:10:30.000000000 +0800
Modify: 2015-12-11 09:10:30.000000000 +0800
Change: 2018-06-10 11:25:08.025620813 +0800
Birth: -
[mrzhang@192 test]$ touch -d '10:00:00' test.log
[mrzhang@192 test]$ stat test.log
...
Access: 2018-06-10 10:00:00.000000000 +0800
Modify: 2018-06-10 10:00:00.000000000 +0800
Change: 2018-06-10 11:39:28.827614789 +0800
[mrzhang@192 test]$ touch -d '2016-09-09 10:00:01' test.log
[mrzhang@192 test]$ stat test.log
...
Access: 2016-09-09 10:00:01.000000000 +0800
Modify: 2016-09-09 10:00:01.000000000 +0800
Change: 2018-06-10 11:40:17.437614448 +0800
- 使用-t 修改文件的时间为指定的时间,时间格式是:
[[CC] YY]MMDDhhmm[.ss]
:
- 使用-t 修改文件的时间为指定的时间,时间格式是:
[mrzhang@192 test]$ stat test.log
Access: 2017-09-09 12:34:56.000000000 +0800
Modify: 2017-09-09 12:34:56.000000000 +0800
Change: 2018-06-10 11:53:50.343608759 +0800
[mrzhang@192 test]$ touch -t 201609091234.56 test.log
[mrzhang@192 test]$ stat test.log
Access: 2016-09-09 12:34:56.000000000 +0800
Modify: 2016-09-09 12:34:56.000000000 +0800
Change: 2018-06-10 11:54:06.481608646 +0800
如果要查看该文件更多的参数,可以参考:touch --help
。
14. nl命令
Linux中的nl命令是用于计算文件的行号,该命令可以将输出的文件自动加上行号。该命令比较简单,来看一下参数:
-b :指定行号指定的方式,主要有两种:
-b a :表示不论是否为空行,也同样列出行号(类似 cat -n);
-b t :如果有空行,空的那一行不要列出行号(默认情况);
-n :列出行号表示的方法,主要有三种:
-n ln :行号在屏幕的最左方显示;
-n rn :行号在自己栏位的最右方显示,且不加 0 ;
-n rz :行号在自己栏位的最右方显示,且加 0 ;
-w :行号栏位的占用的位数。
-p :在逻辑定界符处不重新开始计算。
然后来看一下例子:先查看文件内容,展示行号:
[mrzhang@192 test]$ cat test1.log
ubuntu system
system 123456
right
[mrzhang@192 test]$ nl test1.log
1 ubuntu system
2 system 123456
3 right
[mrzhang@192 test]$
我们将列出的空行也加上行号:
[mrzhang@192 test]$ nl -b a test1.log
1 ubuntu system
2
3 system 123456
4 right
[mrzhang@192 test]$
让行号前面自动补0,统一输出格式:
[mrzhang@192 test]$ nl -b a -n rz test1.log
000001 ubuntu system
000002
000003 system 123456
000004 right
[mrzhang@192 test]$
注意下,nl -b a -n rz test1.log
这里行号的位数默认是6位,如果要调整位数可以使用-w 3
调整为具体的位数:
[mrzhang@192 test]$ nl -b a -n rz -w 3 test1.log
001 ubuntu system
002
003 system 123456
004 right
这里参考自:http://man.linuxde.net/nl
15.mkdir命令
mkdir命令用来创建目录,要求创建目录的用户在当前目录中要有写的权限,并且指定的目录名不能是已存在的目录,默认情况下,也就是如果目录中没有添加路径,那么就是在当前目录下创建。来看下它的参数:
-m --mode=模式 设置该目录的权限(类似 chmod命令),权限可以是777格式,或者-m=r--
-p --parents 递归创建目录,也就是如果要创建目录的上级目录还不存在,则会一并创建上层目录
-v --verbose 每次创建新目录都显示信息
来看一下例子,先创建一个空目录:
[mrzhang@192 test]$ mkdir test0610
[mrzhang@192 test]$ ll
total 0
drwxrwxr-x. 2 mrzhang mrzhang 6 Jun 10 21:32 test0610
如果要创建多个,可以使用空格进行分割:
[mrzhang@192 test0610]$ mkdir test0610_01 test0610_02
[mrzhang@192 test0610]$ ll
total 0
drwxrwxr-x. 2 mrzhang mrzhang 6 Jun 10 21:51 test0610_01
drwxrwxr-x. 2 mrzhang mrzhang 6 Jun 10 21:51 test0610_02
创建多个目录,还可以使用大括号括起来,中间使用逗号进行分割,并且逗号前后不要有空格:
[mrzhang@192 test0610]$ rmdir test0610_01
[mrzhang@192 test0610]$ rmdir test0610_02
[mrzhang@192 test0610]$ ll
total 0
[mrzhang@192 test0610]$ mkdir {test0610_01,test0610_02}
再递归创建多个目录:
[mrzhang@192 test]$ mkdir -p test0611/test0611_01
[mrzhang@192 test]$ ll
total 0
drwxrwxr-x. 2 mrzhang mrzhang 6 Jun 10 21:32 test0610
drwxrwxr-x. 3 mrzhang mrzhang 25 Jun 10 21:34 test0611
[mrzhang@192 test]$ cd test0611/
[mrzhang@192 test0611]$ ll
total 0
drwxrwxr-x. 2 mrzhang mrzhang 6 Jun 10 21:34 test0611_01
然后,创建一个权限是444的目录:
[mrzhang@192 test0612]$ ll
total 0
[mrzhang@192 test0612]$ mkdir -m 444 test0612_01
[mrzhang@192 test0612]$ mkdir -m=r-- test0612_02
[mrzhang@192 test0612]$ ll
total 0
dr--r--r--. 2 mrzhang mrzhang 6 Jun 10 22:06 test0612_01
dr--r--r--. 2 mrzhang mrzhang 6 Jun 10 22:06 test0612_02
再然后,创建的时候展示创建的信息:
[mrzhang@192 test0611]$ mkdir -v test0613
mkdir: created directory ‘test0613’
[mrzhang@192 test0611]$ ll
total 0
drwxrwxr-x. 2 mrzhang mrzhang 6 Jun 10 21:34 test0611_01
drwxrwxrwx. 2 mrzhang mrzhang 6 Jun 10 21:34 test0612
drwxrwxr-x. 2 mrzhang mrzhang 6 Jun 10 21:35 test0613
最后,使用一个命令创建项目的目录结构:
[mrzhang@192 test0611]$ cd test0613/
[mrzhang@192 test0613]$ ll
total 0
[mrzhang@192 test0611]$ mkdir -vp scf/{lib/,bin/,doc/{info,product},logs/{info,product},service/deploy/{info,product}}
然后使用tree命令查看下树结构,默认情况下应该是没有该命令的,切换至root用户下载即可:sudo yum install tree
,下载完成后,就可以使用了:
[mrzhang@192 test0613]$ tree scf/
scf/
├── bin
├── doc
│ ├── info
│ └── product
├── lib
├── logs
│ ├── info
│ └── product
└── service
└── deploy
├── info
└── product
12 directories, 0 files
本文参考自:http://www.cnblogs.com/peida/archive/2012/10/25/2738271.html
https://www.ibm.com/developerworks/cn/aix/library/au-badunixhabits.html
16. rmdir命令
rmdir目录是用于删除目录的,并且删除的 是空目录,也就是说这个目录在使用该命令进行删除前必须是空的,当然删除目录时,必须有相应的写权限。
-p 递归删除,要删除的目录为空,如果整个路径被删除或者由于某种原因保留部分路径,则系统在标准输出上显示相应的信息;
-v --verbose 删除时显示指令执行过程
来简单看下,文件目录如下:
[mrzhang@192 test0611]$ tree test0612/
test0612/
├── test0612_01
│ └── test0612_01_01
└── test0612_02
3 directories, 0 files
直接删除目录:
[mrzhang@192 test0612]$ rmdir -v test0612_01
rmdir: removing directory, ‘test0612_01’
rmdir: failed to remove ‘test0612_01’: Directory not empty
提示目录非空,无法删除,如果子目录为空,可以使用-p 递归删除,删除的时候,记得输入子目录的全路径:
[mrzhang@192 test0612]$ rmdir -p -v test0612_01/test0612_01_01/
rmdir: removing directory, ‘test0612_01/test0612_01_01/’
rmdir: removing directory, ‘test0612_01’
一般情况下,删除非空命令的时候会提示一个错误,不过我们可以使用参数来忽略这个错误,当然也仅仅是忽略:
[mrzhang@192 test0612]$ rmdir test0612_02/
rmdir: failed to remove ‘test0612_02/’: Directory not empty
[mrzhang@192 test0612]$ rmdir --ignore-fail-on-non-empty test0612_02/
[mrzhang@192 test0612]$ ll
total 0
drwxrwxr-x. 2 mrzhang mrzhang 22 Jun 10 22:38 test0612_02