Linux命令学习(一)

前言

本文及接下来的几篇文章主要来学习下Linux服务器操作中的常用命令,使用系统版本是:CentOS 7.4.17.08。 本文主要学习的Linux命令有:netstattailheadcattaclessmorepwdcdlstypewhichtouchnlmkdirrmdir

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命令的功能很多,我们来看它几个常用的功能。

  1. cat [file],查看文件内容,查看全部;也可以根据关键字查询;
[mrzhang@192 zhangkeke]$ cat test.log                 # 查看文件全部内容
[mrzhang@192 zhangkeke]$ cat test.log | grep 20     # 将查询文件中包含20的内容
  1. 创建文件,如果文件已存在,则是编辑文件,会覆盖掉原有的文件内容;如果有需要的话,可以使用该命令进行清空文件内容;
[mrzhang@192 zhangkeke]$ cat >test2.log  << EOF
> 0519
> 0520
> EOF
[mrzhang@192 zhangkeke]$ cat test2.log
0519
0520

通过EOF来告诉bash哪个符号代表文件结束,当然我们也可也使用其他的符号。

  1. 将几个文件合并为一个文件;
[mrzhang@192 zhangkeke]$ cat test.log test2.log > test3.log
  1. 向原来文件的尾部写入内容;与上面创建编辑文件类似,只需要将原来的 > 换成 >>即可;
[mrzhang@192 zhangkeke]$ cat >>test.log <
  1. 写入内容的时候,对 符号是特殊变量,如果直接写该符号,有可能被认为要调用系统变量,所以需要使用\进行转义下:
[mrzhang@192 zhangkeke]$ cat >test.log < DATE=$(date)
> EOF
[mrzhang@192 zhangkeke]$ cat test.log 
DATE=Sat May 19 21:48:19 CST 2018
[mrzhang@192 zhangkeke]$ cat >test.log < 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 显示连续空行为一行
    1. less命令的强大不在于这些参数,而在于使用less命令打开文件后,类似于vi快捷键的导航命令。我们在使用less命令打开文件后,可以使用以下一些导航命令进行操作:
G 快速定位到最后一行(方便我们查看日志)
g 快速定位到第一行
q/ZZ 退出less命令

k 向上移动一行
j 向下移动一行
f 向下移动一屏或者说向后移动一屏
b 向上移动一屏或者说向前移动一屏
d 向下移动半屏
u 向上移动半屏
v/vi 编辑该文件
空格 向下移动一屏
回车 向下移动一行
    1. 另外,就是搜索的导航命令,这个功能十分强大,可以用于我们查看日志等相关的操作,主要搜索方式有下面两种(搜索正则表达式):
/ 向后搜索(向下搜索),适合从文件的头部往后搜索
n 向后查找下一个匹配的
N 向前查找下一个匹配的

? 向前搜索(向上搜索),适合从文件的尾部往前搜索
n 向前查找下一个匹配的
N 向后查找下一个匹配的

= 显示当前行信息,如行号、字节位置等

对于第二种?这种形式的我们使用的比较多,因为查看异常日志的时候,我们一般都是查看最后一次exception,然后以此往前进行查询。可以简单看下 = 等号这个导航命令:

test3.log lines 17-39/81 byte 119/185 64%  (press RETURN)
    1. 另外,当使用 less 查看大文件时,可以在任何一个位置作标记,然后可以通过命令导航到标有特定标记的文本位置:
ma   使用 a 标记文本的当前位置
'a   导航到标记 a 处

标记的时候,输入 m 后,弹出 mark:,然后输入a 标记文本的当前位置,而要导航到标记的位置的话,先输入',然后弹出 goto mark:,输入a 导航到标记处;

    1. 除此之外,less命令还支持同时浏览多个文件:
  • 第一种,直接less 多个文件,就可以浏览多个文件:(默认先展示第一个)
[mrzhang@192 zhangkeke]$ less test.log test3.log
  • 第二种,浏览一个文件时,使用:e打开另一个文件:
[mrzhang@192 zhangkeke]$ less test.log

输入 :e 之后:

Examine: 

输入另一个文件的地址及名称就可以了。而当打开多个文件时,可以使用如下命令在多个文件之间切换:

:n  浏览下一个文件
:p  浏览前一个文件
    1. 直接定位到某个位置:
[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 .
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 帮助页面,查看所有参数

我们来看几个简单的例子:

    1. 查看当前目录中所有以test开头的文件的详细内容:
[mrzhang@192 zhangkeke]$ ls -l test*
    1. 以修改时间排序展示文件,最新的排在后面:
[mrzhang@192 zhangkeke]$ ls -ltr
    1. 按照文件大小进行降序排列:
[mrzhang@192 zhangkeke]$ ls -lR
    1. 通过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 --helpman 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中的文件有三个时间:该文件的访问时间,修改时间,状态改变时间。

  1. 访问时间:每读一次该文件的内容,该时间就会更新一次,比如使用cat命令;
  2. 修改时间:对文件修改一次,该时间就会更新一次,比如 vi命令 修改,而我们使用ll列出的时间就是这个时间;
  3. 状态改变时间:该文件的属性发生了改变,该时间就会更新一次,比如通过chmod命令更改之后,这个时间就会更新。
  4. 如果要查看文件的这几个时间,可以通过stat命令来查看。

下面,我们还是通过几个简单的例子来学习下该命令:

    1. 创建一个新的文件。我们新建一个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
    1. 更改某一个文件的修改时间和另一个时间相同。命令格式是: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
    1. 使用-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
    1. 使用-t 修改文件的时间为指定的时间,时间格式是:[[CC] YY]MMDDhhmm[.ss]
[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

你可能感兴趣的:(Linux命令学习(一))