zoukankan      html  css  js  c++  java
  • linux shell 脚本攻略学习 -- head命令详解, tail命令详解

    当要查看上千行的大文件时,我们可不会用cat命令把整个文件内容给打印出来,相反,我们可能只需要看文件的一小部分地内容(例如文件的前十行和后十行),我们也有可能需要打印出来前n行或后n行,也有可能打印除了前n行或后n行之外的所有行,也有可能需要实时监控log日志的更新,那么怎么实现呢?下面一起来看一下linux下使用率极高的head ,tail两个命令。

    一、head命令详解

    首先,输入head --help查看帮助信息:

    复制代码
    amosli@amosli-pc:~/learn/fd$ head --help
    Usage: head [OPTION]... [FILE]...
    Print the first 10 lines of each FILE to standard output.
    With more than one FILE, precede each with a header giving the file name.
    With no FILE, or when FILE is -, read standard input.
    
    Mandatory arguments to long options are mandatory for short options too.
      -c, --bytes=[-]K         print the first K bytes of each file;
                                 with the leading `-', print all but the last
                                 K bytes of each file
      -n, --lines=[-]K         print the first K lines instead of the first 10;
                                 with the leading `-', print all but the last
                                 K lines of each file
      -q, --quiet, --silent    never print headers giving file names
      -v, --verbose            always print headers giving file names
          --help     display this help and exit
          --version  output version information and exit
    
    K may have a multiplier suffix:
    b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024,
    GB 1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y.
    复制代码

    head命令的语法格式为:

    head [OPTION]... [FILE]...

    接下来将在实例中讲解各参数含义及用法:

    实例:

    1.使用head命令查看文件内容前十行

    新建test.txt,共14行.

    复制代码
    amosli@amosli-pc:~/learn/fd$ cat -n test.txt 
         1    a
         2    b
         3    c
         4    d
         5    e
         6    f
         7    g
         8    h
         9    i
        10    j
        11    k
        12    l
        13    m
        14    n
    复制代码

    使用head命令查看前十行,head命令默认显示文件前十行

    复制代码
    amosli@amosli-pc:~/learn/fd$ head test.txt 
    a
    b
    c
    d
    e
    f
    g
    h
    i
    j
    复制代码

    2.-n参数,显示test.txt文件的前3行

    amosli@amosli-pc:~/learn/fd$ head -n 3 test.txt 
    a
    b
    c

    英文提示信息:

      -n, --lines=[-]K         print the first K lines instead of the first 10;                   

    3.-n参数显示除了文件最后3行外的所有内容

    复制代码
    amosli@amosli-pc:~/learn/fd$ head -n -3 test.txt 
    a
    b
    c
    d
    e
    f
    g
    h
    i
    j
    k
    复制代码

    英文提示信息:

      -n, --lines=[-]K         print the first K lines instead of the first 10;
                                 with the leading `-', print all but the last
                                 K lines of each file

    加上'-',打印所有内容除了最后的K行。

    4.-c参数,按文件内容大小来打印,打印前2个字节的内容

    amosli@amosli-pc:~/learn/fd$ head -c 2 test.txt 
    a

    2个字节就是一个“a”字母。

    英文提示信息:

      -c, --bytes=[-]K         print the first K bytes of each file;

    5.-c参数,打印除了最后2个字节的文件内容

    复制代码
    amosli@amosli-pc:~/learn/fd$ head -c -2 test.txt 
    a
    b
    c
    d
    e
    f
    g
    h
    i
    j
    k
    l
    m
    复制代码

    英文提示信息:

      -c, --bytes=[-]K         print the first K bytes of each file;
                                 with the leading `-', print all but the last
                                 K bytes of each file

    6.-q参数,打印时不显示文件名称

    复制代码
    amosli@amosli-pc:~/learn/fd$ head -q test.txt 
    a
    b
    c
    d
    e
    f
    g
    h
    i
    j
    复制代码

    英文提示信息:

      -q, --quiet, --silent    never print headers giving file names

    其实后面跟上--quiet,--silent都是一样的,都不会显示文件名称,和默认打印是一样的效果。

    7.-v参数,打印是显示文件名称

    复制代码
    amosli@amosli-pc:~/learn/fd$ head -v test.txt 
    ==> test.txt <==
    a
    b
    c
    d
    e
    f
    g
    h
    i
    j
    复制代码

    英文提示信息:

      -v, --verbose            always print headers giving file names

    其中,用--verbose和-v显示的是一样的效果

    复制代码
    amosli@amosli-pc:~/learn/fd$ head --verbose test.txt 
    ==> test.txt <==
    a
    b
    c
    d
    e
    f
    g
    h
    i
    j
    复制代码

    8.打印多个文件的内容

    复制代码
    amosli@amosli-pc:~/learn/fd$ head -n 3 test.txt test2.txt 
    ==> test.txt <==
    a
    b
    c
    
    ==> test2.txt <==
    c
    d
    e
    复制代码

    二、tail命令详解

    tail命令和head 命令非常相似,只不过它是打印文件的尾部内容的,当然也有一些特色之处,下面一起来看看吧。

    首先,输入tail --help看一下提示信息

    复制代码
    amosli@amosli-pc:~/learn/fd$ tail --help 
    Usage: tail [OPTION]... [FILE]...
    Print the last 10 lines of each FILE to standard output.
    With more than one FILE, precede each with a header giving the file name.
    With no FILE, or when FILE is -, read standard input.
    
    Mandatory arguments to long options are mandatory for short options too.
      -c, --bytes=K            output the last K bytes; alternatively, use -c +K
                               to output bytes starting with the Kth of each file
      -f, --follow[={name|descriptor}]
                               output appended data as the file grows;
                               -f, --follow, and --follow=descriptor are
                               equivalent
      -F                       same as --follow=name --retry
      -n, --lines=K            output the last K lines, instead of the last 10;
                               or use -n +K to output lines starting with the Kth
          --max-unchanged-stats=N
                               with --follow=name, reopen a FILE which has not
                               changed size after N (default 5) iterations
                               to see if it has been unlinked or renamed
                               (this is the usual case of rotated log files).
                               With inotify, this option is rarely useful.
          --pid=PID            with -f, terminate after process ID, PID dies
      -q, --quiet, --silent    never output headers giving file names
          --retry              keep trying to open a file even when it is or
                                 becomes inaccessible; useful when following by
                                 name, i.e., with --follow=name
      -s, --sleep-interval=N   with -f, sleep for approximately N seconds
                                 (default 1.0) between iterations.
                                 With inotify and --pid=P, check process P at
                                 least once every N seconds.
      -v, --verbose            always output headers giving file names
          --help     display this help and exit
          --version  output version information and exit
    
    If the first character of K (the number of bytes or lines) is a `+',
    print beginning with the Kth item from the start of each file, otherwise,
    print the last K items in the file.  K may have a multiplier suffix:
    b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024,
    GB 1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y.
    
    With --follow (-f), tail defaults to following the file descriptor, which
    means that even if a tail'ed file is renamed, tail will continue to track
    its end.  This default behavior is not desirable when you really want to
    track the actual name of the file, not the file descriptor (e.g., log
    rotation).  Use --follow=name in that case.  That causes tail to track the
    named file in a way that accommodates renaming, removal and creation.
    复制代码

    语法格式:

    tail [OPTION]... [FILE]...

    这里由于head和tail实在比较像,这里为了节省篇幅,对相似之处将尽量简洁

    实例:

    test2.txt,共有12行内容为从c-n

    复制代码
    amosli@amosli-pc:~/learn/fd$ cat -n test2.txt 
         1    c
         2    d
         3    e
         4    f
         5    g
         6    h
         7    i
         8    j
         9    k
        10    l
        11    m
        12    n
    复制代码

    1.-c 参数,根据文件字节进行输出打印

      -c, --bytes=K            output the last K bytes; alternatively, use -c +K
                               to output bytes starting with the Kth of each file

    打印test2.txt中的最后4 bytes,如下:

    amosli@amosli-pc:~/learn/fd$ tail -c 4 test2.txt 
    m
    n

    tail -c +4 test2.txt 加上一个‘+’会是什么效果呢?

    复制代码
    amosli@amosli-pc:~/learn/fd$ tail -c +4 test2.txt 
    
    e
    f
    g
    h
    i
    j
    k
    l
    m
    n
    复制代码

    少打印了c d 两个字母,那么 -c +K的意思也就很明了了,即打印文件的所有内容除了前面的K个字节

    2、-n参数,根据文件行数进行打印

    看一下提示信息:

    复制代码
     -n, --lines=K            output the last K lines, instead of the last 10;
                               or use -n +K to output lines starting with the Kth
          --max-unchanged-stats=N
                               with --follow=name, reopen a FILE which has not
                               changed size after N (default 5) iterations
                               to see if it has been unlinked or renamed
                               (this is the usual case of rotated log files).
                               With inotify, this option is rarely useful.
          --pid=PID            with -f, terminate after process ID, PID dies
    复制代码

    打印test2.txt最后的3行内容:

    amosli@amosli-pc:~/learn/fd$ tail -n 3 test2.txt 
    l
    m
    n

    从第3行开始输出test2.txt的所有内容:

    复制代码
    amosli@amosli-pc:~/learn/fd$ tail -n +3 test2.txt 
    e
    f
    g
    h
    i
    j
    k
    l
    m
    n
    复制代码

    3.-q参数,-v参数

     -q, --quiet, --silent    never output headers giving file names
          --retry              keep trying to open a file even when it is or
                                 becomes inaccessible; useful when following by
                                 name, i.e., with --follow=name

    不打印文件名称信息:

    复制代码
    amosli@amosli-pc:~/learn/fd$ tail -q  test2.txt 
    e
    f
    g
    h
    i
    j
    k
    l
    m
    n
    复制代码

    打印文件名称信息:

    复制代码
    amosli@amosli-pc:~/learn/fd$ tail -v test2.txt 
    ==> test2.txt <==
    e
    f
    g
    h
    i
    j
    k
    l
    m
    n
    复制代码

    4、-f参数

    tail 命令的一个很重要的用法是从一个内容不断增加的文件中读取数据。新增加的内容部民被添加到文件的尾部,因此当新内容被写入文件的时候,可以用tail将其显示出来。只是简单的使用tail的话,它会读取文件的最后10行,然后退出,这样就不能做到实时监控,加入-f参数就可以做到实时监控文件的更新内容了。

    复制代码
    amosli@amosli-pc:~/learn/fd$ tail -f test2.txt 
    g
    h
    i
    j
    k
    l
    m
    n
    o
    p
    复制代码

    ctrl+alt+t新开一个终端,然后执行下面的命令:

    amosli@amosli-pc:~/learn/fd$ echo  'xyz' >> test2.txt

    这个时候你就可以看到前一个终端在里出现了‘xyz’

    复制代码
    amosli@amosli-pc:~/learn/fd$ tail -f test2.txt 
    g
    h
    i
    j
    k
    l
    m
    n
    o
    p
    xyz
    复制代码

    这样就能实时监控项目里的log日志了。

    如果想设定一个间隔时间去查看文件的更新应该怎么做呢?请看-s参数

    5、-s参数

    英文提示信息:

    -s, --sleep-interval=N   with -f, sleep for approximately N seconds
                                 (default 1.0) between iterations.
                                 With inotify and --pid=P, check process P at
                                 least once every N seconds.

    如每隔5秒查看一次test2.txt的内容是否更新

    复制代码
    amosli@amosli-pc:~/learn/fd$ tail -f -s 5 test2.txt
    j
    k
    l
    m
    n
    o
    p
    xyz
    复制代码

     默认是1秒更新一次。

    6.--pid参数

     tail 具有一个很意思的特性,当某个给定进程结束之后,tail也会随之终结.

    假如我们正在读取一个不断增长的文件,进程Foo一直在向该文件追加数据,那么tail就会一直执行,直到进程Foo的结束.

    $PID=$(pidof Foo)
    $tail -f file --pid $PID
    #当进程Foo结束之后,tail也会跟着结束

    例如用gedit打开test2.txt,不断加入数据,然后在终端里使用tail进行监听,具体为:

    复制代码
    amosli@amosli-pc:~/learn/fd$ PID=$(pidof gedit)
    amosli@amosli-pc:~/learn/fd$ tail -f -s 2 test2.txt --pid $PID
    h
    i
    j
    k
    l
    m
    n
    o
    p
    xyz
    复制代码

    然后不断在gedit中追加入‘yyy’后保存,按理说终端里应该会更新,但我的终端不知为何没有更新数据,这里就不帖出来了。

    关闭gedit后,tail监控也关闭掉了。

  • 相关阅读:
    用 Flask 来写个轻博客 (31) — 使用 Flask-Admin 实现 FileSystem 管理
    jenkins持续集成:jenkins+SVN
    Linux基础一:Linux的安装及相关配置
    jenkins持续集成:构建多个job同时执行
    jenkins持续集成:定时构建语法
    Nginx详解二十九:基于Nginx的中间件架构设计
    Nginx详解二十八:Nginx架构篇Nginx+Lua的安全waf防火墙
    Nginx详解二十七:Nginx架构篇之安全篇
    Nginx详解二十六:Nginx架构篇之性能优化
    Nginx详解二十五:Nginx架构篇之Nginx常见的问题
  • 原文地址:https://www.cnblogs.com/ncy1/p/9164505.html
Copyright © 2011-2022 走看看