美文网首页
Linux命令学习(一)

Linux命令学习(一)

作者: 骑着乌龟去看海 | 来源:发表于2018-05-19 10:57 被阅读65次
    前言

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

    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 <<EOF
    
    1. 写入内容的时候,对 $ 符号的处理;比如我们使用cat命令生成一些脚本,因为 $ 符号是特殊变量,如果直接写该符号,有可能被认为要调用系统变量,所以需要使用\进行转义下:
    [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 显示连续空行为一行
    
      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 <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 帮助页面,查看所有参数
    

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

      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命令学习(一)

          本文链接:https://www.haomeiwen.com/subject/qxuodftx.html