Linux 命令学习

本文主要内容来自网络学习整理,东西太多太乱本身就就是作为笔记整理,故没有引用。

ToDo:

1. 熟练使用、理解这几个命令的用法和输出:

sed awk iostate vmstat ping top netstat vi find grep rm ln

  • 定义作用域,大致分类

学习总结

学习指令的步骤:首先善用man help info等帮助命令查看指令帮助手册,网络搜索配合实例输入指令学习,撰写报告。

实际操作中除了较常用的选项,大多数复杂点的指令学过就忘,只剩下大概记忆,传说中的Linux运维三剑客的指令中的awk更是如此,不过忘了就再查,我相信以后多刻意练习就会慢慢熟悉。

对于vi/vim代码编辑器的学习,直接看键位使用说明,在学习上述命令以及安装诸如zabbix、oracle时已在使用,开始慢慢熟悉。

内容目录

vmstat 命令

用于报告虚拟内存统计信息。关于内核线程、虚拟内存、磁盘、陷阱和 CPU 活动的统计信息。由 vmstat 命令生成的报告可以用于平衡系统负载活动。系统范围内的这些统计信息(所有的处理器中)都计算出以百分比表示的平均值,或者计算其总和。

语法

vmstat [ -f ] [ -i ] [ -s ] [ -I ] [ -t ] [ -v ] [ PhysicalVolume ... ] [ Interval [ Count ] ]
NAME
       vmstat - Report virtual memory statistics
SYNOPSIS
       vmstat [options] [delay [count]]  
       vmstat [选项] [<时间间隔>] [<次数>]

常用范例

1. 列出活动和非活动的内存

vmstat的man页面中解析的每一列的意义。最重要的是内存中的free属性和交换分区中的siso属性。

[root@oracle_db database]# vmstat -a
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r   b       swpd   free  inact active      si   so       bi    bo     in    cs us sy id wa st
 5   0      0 1067212 1754012 399864    0    0    48    18  118  267  2  1 97  0  0
  • Free – 空闲的内存空间
  • si – 每秒从磁盘中交换进内存的数据量(以KB为单位)。
  • so – 每秒从内存中交换出磁盘的数据量(以KB为单位)。

:如果不带参数的执行vmstat命令,它会输出自系统启动以来的总结报告

2. 每多少秒执行vmstat,共执行N次

下面命令将会每1秒中执行一次vmstat,执行3次后自动停止执行。

[root@oracle_db database]# vmstat 1 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 5  0      0 1213932   3272 1296668    0    0    50    18  118  267  2  1 97  0  0
 3  0      0 1214016   3272 1296668    0    0     0     0  105  270  0  1 99  0  0
 3  0      0 1214044   3272 1296668    0    0     0    16  110  268  0  2 98  0  0

3. 带时间戳的vmstat命令

-t参数执行vmstat命令,该命令将会在每一行输出后都带一个时间戳,如下所示。

[root@oracle_db ~]# vmstat -t 1 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- -----timestamp-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st                 CST
 2  0      0 1207308   3272 1296644    0    0    52    18  119  268  2  1 97  0  0 2021-08-23 16:28:09
 1  0      0 1207128   3272 1296644    0    0     0     0   95  238  0  1 99  0  0 2021-08-23 16:28:10
 1  0      0 1206836   3272 1296644    0    0     0     0  108  275  1  1 98  0  0 2021-08-23 16:28:11
 1  0      0 1206896   3272 1296644    0    0     0     0  121  285  1  1 98  0  0 2021-08-23 16:28:12
 3  0      0 1206940   3272 1296644    0    0     0     0   95  244  0  2 98  0  0 2021-08-23 16:28:13

4. 统计各种计数器

vmstat命令的-s参数,将输出各种事件计数器和内存的统计信息。

[oracle@oracle_db database]$  vmstat -s
      3798972 K total memory
      1288412 K used memory
       399852 K active memory
      1611496 K inactive memory
      1210644 K free memory
         3272 K buffer memory
      1296644 K swap cache
      4143100 K total swap
            0 K used swap
      4143100 K free swap
        36053 non-nice user cpu ticks
          436 nice user cpu ticks
        21205 system cpu ticks
      1950762 idle cpu ticks
          154 IO-wait cpu ticks
         2307 IRQ cpu ticks
         1740 softirq cpu ticks
            0 stolen cpu ticks
      1039643 pages paged in
       366795 pages paged out
            0 pages swapped in
            0 pages swapped out
      2389877 interrupts
      5387278 CPU context switches
   1629687170 boot time
       105762 forks

5. 磁盘统计信息

vmstat-d参数将会输出所有磁盘的统计信息。

[oracle@oracle_db database]$  vmstat -d
disk- ------------reads------------ ------------writes----------- -----IO------
       total merged sectors      ms  total merged sectors      ms    cur    sec
sda    23120    119 2079286   12808  13873   2290  733647    7946      0     21

6. 以MB为单位输出统计信息

vmstat-S-M参数(大写和MB)将会以MB为单位输出。vmstat默认以KB为单位输出统计信息。

[oracle@oracle_db database]$ vmstat -S M 1 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0   1182      3   1266    0    0    51    18  119  268  2  1 97  0  0
 0  0      0   1182      3   1266    0    0     0     0   94  248  0  1 99  0  0
 1  0      0   1182      3   1266    0    0     0     0   97  240  0  1 99  0  0
 0  0      0   1182      3   1266    0    0     0     0  104  249  0  0 100  0  0
 3  0      0   1182      3   1266    0    0     0     0  101  249  0  1 99  0  0

iostat 命令

iostat 用于CPU统计信息,设备和分区的输入/输出统计信息。用于报告中央处理器(CPU)统计信息和整个系统、适配器、tty 设备、磁盘和 CD-ROM 的输入/输出统计信息。

语法

iostat [选项] [<时间间隔>] [<次数>]

命令参数:

-c: 显示CPU使用情况
-d: 显示磁盘使用情况
-N: 显示磁盘阵列(LVM) 信息
-n: 显示NFS 使用情况
-k: 以 KB 为单位显示
-m: 以 M 为单位显示
-t: 报告每秒向终端读取和写入的字符数和CPU的信息
-V: 显示版本信息
-x: 显示详细信息
-p:[磁盘] 显示磁盘和分区的情况

常用范例

1. 输出CPU和输入/输出(I/O)的统计信息

不带参数的iostat命令将会输出CPU和每个分区的输出/输出的统计信息,如下所示。

[oracle@oracle_db database]$ iostatLinux 4.18.0-305.12.1.el8_4.x86_64 (oracle_db)  08/23/2021      _x86_64_        (1 CPU)avg-cpu:  %user   %nice %system %iowait  %steal   %idle           1.79    0.02    1.25    0.01    0.00   96.93Device             tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtnsda               1.83        51.27        18.09    1039643     366946

2. 只输出CPU的统计信息

iostat命令的-c参数仅输出CPU的统计信息,如下所示。

[oracle@oracle_db database]$ iostat -cLinux 4.18.0-305.12.1.el8_4.x86_64 (oracle_db)  08/23/2021      _x86_64_        (1 CPU)avg-cpu:  %user   %nice %system %iowait  %steal   %idle           1.78    0.02    1.25    0.01    0.00   96.94

3. 只输出磁盘的输入/输出统计信息

iostat命令的-d参数仅输出磁盘的所有分区的输入/输出的统计信息,如下所示。

[oracle@oracle_db database]$ iostat -dLinux 4.18.0-305.12.1.el8_4.x86_64 (oracle_db)  08/23/2021      _x86_64_        (1 CPU)Device             tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtnsda               1.81        50.92        17.98    1039643     367133

4. 只输出某个磁盘的输入/输出统计信息

在默认情况下iostat命令会输出所有分区的统计信息,但是若在iostat命令后加上-p参数和磁盘设备名,该命令将会仅输出列出的磁盘的输入/输出统计信息,如下所示。

[oracle@oracle_db database]$ iostat -p sdaLinux 4.18.0-305.12.1.el8_4.x86_64 (oracle_db)  08/23/2021      _x86_64_        (1 CPU)avg-cpu:  %user   %nice %system %iowait  %steal   %idle           1.77    0.02    1.25    0.01    0.00   96.95Device             tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtnsda               1.81        50.73        17.92    1039643     367364sda2              0.00         0.11         0.00       2356          0sda3              1.78        48.86        17.92    1001399     367268sda1              0.02         1.69         0.00      34708         96[oracle@oracle_db database]$ iostat -pLinux 4.18.0-305.12.1.el8_4.x86_64 (oracle_db)  08/23/2021      _x86_64_        (1 CPU)avg-cpu:  %user   %nice %system %iowait  %steal   %idle           1.76    0.02    1.25    0.01    0.00   96.96Device             tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtnsda               1.80        50.56        17.87    1039643     367514sda1              0.02         1.69         0.00      34708         96sda2              0.00         0.11         0.00       2356          0sda3              1.78        48.70        17.87    1001399     367418实际上 加不加sda都一样

5. 输出逻辑卷管理(LVM)的统计信息

iostat命令的-N(大写)参数将会输出LVM(Logical_Volume_Manager)是linux环境下对磁盘分区进行管理的一种机制,是磁盘分区和文件系统间的一个逻辑层)的统计信息,如下所示。

[oracle@oracle_db database]$ iostat -NLinux 4.18.0-305.12.1.el8_4.x86_64 (oracle_db)  08/23/2021      _x86_64_        (1 CPU)avg-cpu:  %user   %nice %system %iowait  %steal   %idle           1.76    0.02    1.25    0.01    0.00   96.96Device             tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtnsda               1.80        50.43        17.83    1039643     367578

6. iostat版本信息

iostat的-V(大写)参数将会输出iostat的版本信息,如下所示。这种库+ —V的命令,大多数都能用来查询版本号,如Java -V == Java -version

[oracle@oracle_db database]$ iostat -Vsysstat version 11.7.3(C) Sebastien Godard (sysstat <at> orange.fr)

netstat 命令

利用netstat 指令可得知整个Linux系统的网络情况。用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。它输出内容通常非常多,需要配合grep筛选最好

语法

netstat [-acCeFghilMnNoprstuvVwx][-A<网络类型>][--ip]

参数说明

  • -a (all)显示所有选项,默认不显示LISTEN相关
  • -t (tcp)仅显示tcp相关选项
  • -u (udp)仅显示udp相关选项
  • -n 拒绝显示别名,能显示数字的全部转化成数字
  • -l 仅列出有在 Listen (监听) 的服務状态
  • -p 显示建立相关链接的程序名
  • -r 显示路由信息,路由表
  • -e 显示扩展信息,例如uid等
  • -s 按各个协议进行统计
  • -c 每隔一个固定时间,执行该netstat命令

:LISTEN和LISTENING的状态只有用-a或者-l才能看到

常用范例

1. 列出所有端口 (包括监听和未监听的)

列出所有端口 netstat -a

[root@oracle_db ~]# netstat -a | moreActive Internet connections (servers and established)Proto Recv-Q Send-Q Local Address           Foreign Address         Statetcp        0      0 0.0.0.0:zabbix-agent    0.0.0.0:*               LISTENtcp        0      0 0.0.0.0:sunrpc          0.0.0.0:*               LISTENtcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTENtcp6       0      0 [::]:ssh                [::]:*                  LISTENtcp6       0      0 localhost:ipp           [::]:*                  LISTENtcp6       0      0 localhost:postgres      [::]:*                  LISTENtcp6       0      0 localhost:6011          [::]:*                  LISTENtcp6       0      0 localhost:14202         localhost:postgres      TIME_WAITudp        0      0 0.0.0.0:63582           0.0.0.0:*udp        0      0 0.0.0.0:sunrpc          0.0.0.0:*udp        0      0 localhost:323           0.0.0.0:*udp        0      0 0.0.0.0:mdns            0.0.0.0:*udp6       0      0 [::]:sunrpc             [::]:*udp6       0      0 localhost:323           [::]:*udp6       0      0 [::]:37714              [::]:*udp6       0      0 localhost:wap-vcal-s    localhost:wap-vcal-s    ESTABLISHEDudp6       0      0 [::]:mdns               [::]:*raw6       0      0 [::]:ipv6-icmp          [::]:*                  7Active UNIX domain sockets (servers and established)Proto RefCnt Flags       Type       State         I-Node   Path

列出所有 tcp 端口 netstat -at

[root@oracle_db ~]# netstat -atActive Internet connections (servers and established)Proto Recv-Q Send-Q Local Address           Foreign Address         Statetcp        0      0 0.0.0.0:zabbix-agent    0.0.0.0:*               LISTENtcp        0      0 0.0.0.0:sunrpc          0.0.0.0:*               LISTENtcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTENtcp        0      0 localhost:ipp           0.0.0.0:*               LISTENtcp        0      0 localhost:postgres      0.0.0.0:*               LISTENtcp        0      0 localhost:6011          0.0.0.0:*               LISTENtcp        0     64 oracle_db:ssh           192.168.136.1:51558     ESTABLISHEDtcp        0      0 oracle_db:ssh           192.168.136.1:58328     ESTABLISHEDtcp       32      0 oracle_db:63828         oscp-router01.gno:https CLOSE_WAITtcp6       0      0 [::]:zabbix-agent       [::]:*                  LISTENtcp6       0      0 [::]:mysql              [::]:*                  LISTENtcp6       0      0 [::]:sunrpc             [::]:*                  LISTENtcp6       0      0 [::]:http               [::]:*                  LISTENtcp6       0      0 [::]:ssh                [::]:*                  LISTENtcp6       0      0 localhost:ipp           [::]:*                  LISTENtcp6       0      0 localhost:postgres      [::]:*                  LISTENtcp6       0      0 localhost:6011          [::]:*                  LISTENtcp6       0      0 localhost:14244         localhost:postgres      TIME_WAIT

列出所有 udp 端口 netstat -au

[root@oracle_db ~]#  netstat -auActive Internet connections (servers and established)Proto Recv-Q Send-Q Local Address           Foreign Address         Stateudp        0      0 0.0.0.0:bootps          0.0.0.0:*udp        0      0 oracle_db:bootpc        192.168.136.254:bootps  ESTABLISHEDudp        0      0 0.0.0.0:63582           0.0.0.0:*udp        0      0 0.0.0.0:sunrpc          0.0.0.0:*udp        0      0 localhost:323           0.0.0.0:*udp        0      0 0.0.0.0:mdns            0.0.0.0:*udp6       0      0 [::]:sunrpc             [::]:*udp6       0      0 localhost:323           [::]:*udp6       0      0 [::]:37714              [::]:*udp6       0      0 localhost:wap-vcal-s    localhost:wap-vcal-s    ESTABLISHEDudp6       0      0 [::]:mdns               [::]:*

2. 列出所有处于监听状态的 Sockets

只显示监听端口 netstat -l

[root@oracle_db ~]# netstat -lActive Internet connections (only servers)Proto Recv-Q Send-Q Local Address           Foreign Address         Statetcp        0      0 0.0.0.0:zabbix-agent    0.0.0.0:*               LISTENtcp        0      0 0.0.0.0:sunrpc          0.0.0.0:*               LISTENtcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTENtcp        0      0 localhost:ipp           0.0.0.0:*               LISTENtcp        0      0 localhost:postgres      0.0.0.0:*               LISTENtcp        0      0 localhost:6011          0.0.0.0:*               LISTENtcp6       0      0 [::]:zabbix-agent       [::]:*                  LISTENActive UNIX domain sockets (only servers)Proto RefCnt Flags       Type       State         I-Node   Pathunix  2      [ ACC ]     STREAM     LISTENING     35914    @/tmp/dbus-pggDtNdounix  2      [ ACC ]     STREAM     LISTENING     21966    @/org/kernel/linux/storage/multipathdunix  2      [ ACC ]     STREAM     LISTENING     33665    /var/lib/sss/pipes/nssunix  2      [ ACC ]     STREAM     LISTENING     39571    @/tmp/.ICE-unix/1920Active Bluetooth connections (only servers)Proto  Destination       Source            State         PSM DCID   SCID      IMTU    OMTU SecurityProto  Destination       Source            State     Channel

只列出所有监听 tcp 端口 netstat -lt

[root@oracle_db ~]#  netstat -ltActive Internet connections (only servers)Proto Recv-Q Send-Q Local Address           Foreign Address         Statetcp        0      0 0.0.0.0:zabbix-agent    0.0.0.0:*               LISTENtcp        0      0 0.0.0.0:sunrpc          0.0.0.0:*               LISTENtcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTENtcp        0      0 localhost:postgres      0.0.0.0:*               LISTENtcp        0      0 localhost:6011          0.0.0.0:*               LISTENtcp6       0      0 [::]:zabbix-agent       [::]:*                  LISTENtcp6       0      0 [::]:mysql              [::]:*                  LISTENtcp6       0      0 [::]:sunrpc             [::]:*                  LISTENtcp6       0      0 [::]:http               [::]:*                  LISTENtcp6       0      0 [::]:ssh                [::]:*                  LISTEN

只列出所有监听 udp 端口 netstat -lu

[root@oracle_db ~]# netstat -luActive Internet connections (only servers)Proto Recv-Q Send-Q Local Address           Foreign Address         Stateudp        0      0 0.0.0.0:bootps          0.0.0.0:*udp        0      0 0.0.0.0:63582           0.0.0.0:*udp        0      0 0.0.0.0:sunrpc          0.0.0.0:*udp        0      0 localhost:323           0.0.0.0:*udp        0      0 0.0.0.0:mdns            0.0.0.0:*udp6       0      0 [::]:sunrpc             [::]:*udp6       0      0 localhost:323           [::]:*udp6       0      0 [::]:37714              [::]:*

只列出所有监听 UNIX 端口 netstat -lx

[root@oracle_db ~]# netstat -lxActive UNIX domain sockets (only servers)Proto RefCnt Flags       Type       State         I-Node   Pathunix  2      [ ACC ]     STREAM     LISTENING     35914    @/tmp/dbus-pggDtNdounix  2      [ ACC ]     STREAM     LISTENING     21966    @/org/kernel/linux/storage/multipathdunix  2      [ ACC ]     STREAM     LISTENING     33665    /var/lib/sss/pipes/nssunix  2      [ ACC ]     STREAM     LISTENING     39571    @/tmp/.ICE-unix/1920unix  2      [ ACC ]     SEQPACKET  LISTENING     21535    /run/systemd/coredumpunix  2      [ ACC ]     STREAM     LISTENING     40762    @/tmp/.X11-unix/X0

3. 显示每个协议的统计信息

显示所有端口的统计信息 netstat -s

[root@oracle_db ~]# netstat -sIp:    Forwarding: 1    157317 total packets received    1 with invalid addresses    0 forwarded    0 incoming packets discarded    157315 incoming packets delivered    245251 requests sent out    147 dropped because of missing routeIcmp:    0 ICMP messages received    0 input ICMP message failed    ICMP input histogram:    0 ICMP messages sent    0 ICMP messages failed    ICMP output histogram:Tcp:    3766 active connection openings    3153 passive connection openings    530 failed connection attempts    7 connection resets received    2 connections established    194056 segments received    282364 segments sent out    73 segments retransmitted    0 bad segments received    537 resets sentUdp:    969 packets received    0 packets to unknown port received    0 packet receive errors    705 packets sent    0 receive buffer errors    0 send buffer errors    IgnoredMulti: 127UdpLite:TcpExt:    3209 TCP sockets finished time wait in fast timer    257 delayed acks sent    22 delayed acks further delayed because of locked socket    Quick ack mode was activated 21 times    33973 packet headers predicted    72653 acknowledgments not containing data payload received    64040 predicted acknowledgments    10 congestion windows recovered without slow start after partial ack    TCPLostRetransmit: 43    TCPTimeouts: 21    TCPLossProbes: 9    TCPBacklogCoalesce: 4605    TCPDSACKOldSent: 1    TCPDSACKRecv: 8    4 connections reset due to early user close    2 connections aborted due to timeout    TCPDSACKIgnoredNoUndo: 5    TCPRcvCoalesce: 5939    TCPAutoCorking: 13    TCPSynRetrans: 49    TCPOrigDataSent: 251533    TCPHystartTrainDetect: 3    TCPHystartTrainCwnd: 50    TCPKeepAlive: 9    TCPDelivered: 254763IpExt:    InNoRoutes: 1    InMcastPkts: 429    OutMcastPkts: 90    InBcastPkts: 127    OutBcastPkts: 6    InOctets: 107692888    OutOctets: 26432024    InMcastOctets: 50503    OutMcastOctets: 11954    InBcastOctets: 16464    OutBcastOctets: 468    InNoECTPkts: 216089MPTcpExt:

显示 TCP 或 UDP 端口的统计信息 netstat -st 或 -su

netstat -st netstat -su

4. 在 netstat 输出中显示 PID 和进程名称 netstat -p

netstat -p 可以与其它开关一起使用,就可以添加 “PID/进程名称” 到 netstat 输出中,这样 debugging 的时候可以很方便的发现特定端口运行的程序。

[root@oracle_db ~]# netstat -ptActive Internet connections (w/o servers)Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program nametcp        0     48 oracle_db:ssh           192.168.136.1:51558     ESTABLISHED 51899/sshd: root [ptcp        0      0 oracle_db:ssh           192.168.136.1:58328     ESTABLISHED 51925/sshd: root [ptcp       32      0 oracle_db:63828         oscp-router01.gno:https CLOSE_WAIT  2141/gnome-shelltcp6       0      0 localhost:14338         localhost:postgres      TIME_WAIT   -

5. 在 netstat 输出中不显示主机,端口和用户名 (host, port or user)

当你不想让主机,端口和用户名显示,使用 netstat -n。将会使用数字代替那些名称。

同样可以加速输出,因为不用进行比对查询。

netstat -an

如果只是不想让这三个名称中的一个被显示,使用以下命令

netstat -a --numeric-portsnetstat -a --numeric-hostsnetstat -a --numeric-users # 参数顺序可换 如下和本条等同,-a可后置netstat --numeric-users -a

6. 持续输出 netstat 信息

netstat 将每隔一秒输出网络信息。

netstat -c Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address           Foreign Address         State tcp        0      0 ramesh-laptop.loc:36130 101-101-181-225.ama:www ESTABLISHED tcp        1      1 ramesh-laptop.loc:52564 101.11.169.230:www      CLOSING tcp        0      0 ramesh-laptop.loc:43758 server-101-101-43-2:www ESTABLISHED tcp        1      1 ramesh-laptop.loc:42367 101.101.34.101:www      CLOSING ^C

7. 显示系统不支持的地址族 (Address Families)

netstat --verbose

在输出的末尾,会有如下的信息

netstat: no support for `AF IPX' on this system.netstat: no support for `AF AX25' on this system.netstat: no support for `AF X25' on this system.netstat: no support for `AF NETROM' on this system.Active Bluetooth connections (w/o servers)Proto  Destination       Source            State         PSM DCID   SCID      IMTU    OMTU Securitynetstat: no support for `BTPROTO L2CAP' on this system.Proto  Destination       Source            State     Channelnetstat: no support for `BTPROTO RFCOMM' on this system.

8. 显示核心路由信息 netstat -r

# netstat -r Kernel IP routing table Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface 192.168.1.0     *               255.255.255.0   U         0 0          0 eth2 link-local      *               255.255.0.0     U         0 0          0 eth2 default         192.168.1.1     0.0.0.0         UG        0 0          0 eth2

注: 使用 netstat -rn 显示数字格式,不查询主机名称。

[root@oracle_db ~]# netstat -rnKernel IP routing tableDestination     Gateway         Genmask         Flags   MSS Window  irtt Iface0.0.0.0         192.168.136.2   0.0.0.0         UG        0 0          0 ens33192.168.136.0   0.0.0.0         255.255.255.0   U         0 0          0 ens33

9. 找出程序运行的端口

并不是所有的进程都能找到,没有权限的会不显示,使用 root 权限查看所有的信息。

netstat -ap | grep ssh tcp        1      0 dev-db:ssh           101.174.100.22:39213        CLOSE_WAIT  - tcp        1      0 dev-db:ssh           101.174.100.22:57643        CLOSE_WAIT  -

找出运行在指定端口的进程

netstat -an | grep ':80'

10. 显示网络接口列表

[root@oracle_db ~]#  netstat -iKernel Interface tableIface             MTU    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flgens33            1500   232044      0      0 0        259563      0      0      0 BMRUlo              65536    41251      0      0 0         41251      0      0      0 LRUvirbr0           1500        0      0      0 0             0      0      0      0 BMU

显示详细信息,像是 ifconfig 使用 netstat -ie:

[root@oracle_db ~]#  netstat -ieKernel Interface tableens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500        inet 192.168.136.129  netmask 255.255.255.0  broadcast 192.168.136.255        inet6 fe80::6419:99a0:12c4:39e8  prefixlen 64  scopeid 0x20<link>        ether 00:0c:29:26:e9:3c  txqueuelen 1000  (Ethernet)        RX packets 232169  bytes 114100849 (108.8 MiB)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 259791  bytes 32423811 (30.9 MiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536        inet 127.0.0.1  netmask 255.0.0.0        inet6 ::1  prefixlen 128  scopeid 0x10<host>        loop  txqueuelen 1000  (Local Loopback)        RX packets 41289  bytes 3280481 (3.1 MiB)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 41289  bytes 3280481 (3.1 MiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500        ether 52:54:00:eb:41:c8  txqueuelen 1000  (Ethernet)        RX packets 0  bytes 0 (0.0 B)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 0  bytes 0 (0.0 B)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

11. IP和TCP分析

查看连接某服务端口最多的的IP地址

[root@oracle_db ~]#  netstat -nat | grep "192.168.136.1:22" |awk '{print $5}'|awk -F: '{print $1}'|netstat -nat |awk '{print $6}'sort|uniq -c|sort -nr|head -20

TCP各种状态列表

[root@oracle_db ~]# netstat -nat |awk '{print $6}'

先把状态全都取出来,然后使用uniq -c统计,之后再进行排序。

[root@oracle_db ~]# netstat -nat |awk '{print $6}'|sort|uniq -c      1 CLOSE_WAIT      1 established)      2 ESTABLISHED      1 Foreign     14 LISTEN      6 TIME_WAIT

最后的命令如下:

[root@oracle_db ~]# netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn     14 LISTEN      7 TIME_WAIT      2 ESTABLISHED      1 Foreign      1 established)      1 CLOSE_WAIT分析access.log获得访问前10位的ip地址awk '{print $1}' access.log |sort|uniq -c|sort -nr|head -10 

12. 显示当前户籍UDP连接状况

[root@oracle_db ~]# netstat -nuActive Internet connections (w/o servers)Proto Recv-Q Send-Q Local Address           Foreign Address         Stateudp        0      0 192.168.136.129:68      192.168.136.254:67      ESTABLISHEDudp6       0      0 ::1:9207                ::1:9207                ESTABLISHED

13. 显示UDP端口号的使用情况

[root@oracle_db ~]# netstat -apuActive Internet connections (servers and established)Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program nameudp        0      0 0.0.0.0:bootps          0.0.0.0:*                           2087/dnsmasqudp        0      0 oracle_db:bootpc        192.168.136.254:bootps  ESTABLISHED 1066/NetworkManagerudp        0      0 0.0.0.0:63582           0.0.0.0:*                           986/avahi-daemon: rudp        0      0 0.0.0.0:sunrpc          0.0.0.0:*                           1/systemdudp        0      0 localhost:323           0.0.0.0:*                           979/chronydudp        0      0 0.0.0.0:mdns            0.0.0.0:*                           986/avahi-daemon: rudp        0      0 oracle_db:58633         139.199.214.202:ntp     ESTABLISHED 979/chronydudp6       0      0 [::]:sunrpc             [::]:*                              1/systemdudp6       0      0 localhost:323           [::]:*                              979/chronydudp6       0      0 [::]:37714              [::]:*                              986/avahi-daemon: rudp6       0      0 localhost:wap-vcal-s    localhost:wap-vcal-s    ESTABLISHED 1159/postmaster

14. 显示组播组的关系

[root@oracle_db ~]# netstat -gIPv6/IPv4 Group MembershipsInterface       RefCnt Group--------------- ------ ---------------------lo              1      all-systems.mcast.netens33           1      224.0.0.251ens33           1      all-systems.mcast.netvirbr0          1      all-systems.mcast.netlo              1      ff02::1lo              1      ff01::1ens33           1      ff02::1:ffc4:39e8ens33           1      ff02::fbens33           1      ff02::1ens33           1      ff01::1virbr0          1      ff02::1virbr0          1      ff01::1virbr0-nic      1      ff02::1virbr0-nic      1      ff01::1

ping 命令

ping命令通过ICMP(Internet控制消息协议)工作;ping可以用来测试本机与目标主机是否联通、联通速度如何、稳定性如何。它的作用主要为:

  • (1)用来检测网络的连通情况和分析网络速度;
  • (2)根据域名得到服务器IP;
  • (3)根据ping返回的TTL值来判断对方所使用的操作系统及数据包经过路由器数量。

语法

ping  [-dfnqrRv][-c<完成次数>][-i<间隔秒数>][-I<网络界面>][-l<前置载入>][-p<范本样式>][-s<数据包大小>][-t<存活数值>]  [主机名称或IP地址]即 ping [参数] 目标主机其中参数为零到多个,目标主机可以是IP或者域名。

参数说明

  • -d 使用Socket的SO_DEBUG功能。

  • -c <完成次数> 设置完成要求回应的次数。

  • -f 极限检测。

  • -i<间隔秒数> 指定收发信息的间隔时间。

  • -I<网络界面> 使用指定的网络接口送出数据包。

  • -l<前置载入> 设置在送出要求信息之前,先行发出的数据包。

  • -n 只输出数值。

  • -p<范本样式> 设置填满数据包的范本样式。

  • -q 不显示指令执行过程,开头和结尾的相关信息除外。

  • -r 忽略普通的Routing Table,直接将数据包送到远端主机上。

  • -R 记录路由过程。

  • -s<数据包大小> 设置数据包的大小。

  • -t<存活数值> 设置存活数值TTL的大小。

  • -v 详细显示指令的执行过程。

  • -w 在 deadline 秒后退出。

  • -W 在等待 timeout 秒后开始执行。

    参数 详解
    -a Audible ping.
    -A 自适应ping,根据ping包往返时间确定ping的速度;
    -b 允许ping一个广播地址;
    -B 不允许ping改变包头的源地址;
    -c count ping指定次数后停止ping;
    -d 使用Socket的SO_DEBUG功能;
    -F flow_label 为ping回显请求分配一个20位的“flow label”,如果未设置,内核会为ping随机分配;
    -f 极限检测,快速连续ping一台主机,ping的速度达到100次每秒;
    -i interval 设定间隔几秒发送一个ping包,默认一秒ping一次;
    -I interface 指定网卡接口、或指定的本机地址送出数据包;
    -l preload 设置在送出要求信息之前,先行发出的数据包;
    -L 抑制组播报文回送,只适用于ping的目标为一个组播地址
    -n 不要将ip地址转换成主机名;
    -p pattern 指定填充ping数据包的十六进制内容,在诊断与数据有关的网络错误时这个选项就非常有用,如:“-p ff”;
    -q 不显示任何传送封包的信息,只显示最后的结果
    -Q tos 设置Qos(Quality of Service),它是ICMP数据报相关位;可以是十进制或十六进制数,详见rfc1349和rfc2474文档;
    -R 记录ping的路由过程(IPv4 only); 注意:由于IP头的限制,最多只能记录9个路由,其他会被忽略;
    -r 忽略正常的路由表,直接将数据包送到远端主机上,通常是查看本机的网络接口是否有问题;如果主机不直接连接的网络上,则返回一个错误。
    -S sndbuf Set socket sndbuf. If not specified, it is selected to buffer not more than one packet.
    -s packetsize 指定每次ping发送的数据字节数,默认为“56字节”+“28字节”的ICMP头,一共是84字节; 包头+内容不能大于65535,所以最大值为65507(linux:65507, windows:65500);
    -t ttl 设置TTL(Time To Live)为指定的值。该字段指定IP包被路由器丢弃之前允许通过的最大网段数;
    -T timestamp_option 设置IP timestamp选项,可以是下面的任何一个:   'tsonly' (only timestamps)   'tsandaddr' (timestamps and addresses)   'tsprespec host1 [host2 [host3]]' (timestamp prespecified hops).
    -M hint 设置MTU(最大传输单元)分片策略。 可设置为:   'do':禁止分片,即使包被丢弃;   'want':当包过大时分片;   'dont':不设置分片标志(DF flag);
    -m mark 设置mark;
    -v 使ping处于verbose方式,它要ping命令除了打印ECHO-RESPONSE数据包之外,还打印其它所有返回的ICMP数据包;
    -U Print full user-to-user latency (the old behaviour). Normally ping prints network round trip time, which can be different f.e. due to DNS failures.
    -W timeout 以毫秒为单位设置ping的超时时间;
    -w deadline deadline;

常用实例

检测是否与主机连通

ping IP地址,来测试网络的连通情况

  • bytes值:数据包大小,也就是字节。
  • time值:响应时间,这个时间越小,说明你连接这个地址速度越快。
  • TTL值:Time To Live,表示DNS记录在DNS服务器上存在的时间,它是IP协议包的一个值,告诉路由器该数据包何时需要被丢弃。
[root@oracle_db ~]# ping www.baidu.comPING www.a.shifen.com (163.177.151.110) 56(84) bytes of data.64 bytes from 163.177.151.110 (163.177.151.110): icmp_seq=1 ttl=128 time=13.8 ms64 bytes from 163.177.151.110 (163.177.151.110): icmp_seq=2 ttl=128 time=8.14 ms64 bytes from 163.177.151.110 (163.177.151.110): icmp_seq=3 ttl=128 time=7.65 ms64 bytes from 163.177.151.110 (163.177.151.110): icmp_seq=4 ttl=128 time=14.5 ms64 bytes from 163.177.151.110 (163.177.151.110): icmp_seq=5 ttl=128 time=7.49 ms^C--- www.a.shifen.com ping statistics ---5 packets transmitted, 5 received, 0% packet loss, time 4011msrtt min/avg/max/mdev = 7.485/10.312/14.527/3.148 ms或者本地主机[root@oracle_db ~]# ping 192.168.136.1PING 192.168.136.1 (192.168.136.1) 56(84) bytes of data.64 bytes from 192.168.136.1: icmp_seq=1 ttl=64 time=0.197 ms64 bytes from 192.168.136.1: icmp_seq=2 ttl=64 time=0.237 ms64 bytes from 192.168.136.1: icmp_seq=3 ttl=64 time=0.252 ms64 bytes from 192.168.136.1: icmp_seq=4 ttl=64 time=0.251 ms^C--- 192.168.136.1 ping statistics ---4 packets transmitted, 4 received, 0% packet loss, time 3082msrtt min/avg/max/mdev = 0.197/0.234/0.252/0.024 ms# 需手动终止Ctrl+C,失败则不需要

指定接收包的次数

[root@oracle_db ~]# ping -c 2 www.baidu.comPING www.a.shifen.com (163.177.151.110) 56(84) bytes of data.64 bytes from 163.177.151.110 (163.177.151.110): icmp_seq=1 ttl=128 time=8.29 ms64 bytes from 163.177.151.110 (163.177.151.110): icmp_seq=2 ttl=128 time=11.0 ms--- www.a.shifen.com ping statistics ---2 packets transmitted, 2 received, 0% packet loss, time 1003msrtt min/avg/max/mdev = 8.290/9.668/11.046/1.378 ms# 收到两次包后后自动退出

多参数使用

[root@oracle_db ~]# ping -i 3 -s 1024 -t 255 g.cn  # ping主机PING g.cn (114.250.65.34) 1024(1052) bytes of data.1032 bytes from 114.250.65.34 (114.250.65.34): icmp_seq=1 ttl=128 time=43.1 ms1032 bytes from 114.250.65.34 (114.250.65.34): icmp_seq=2 ttl=128 time=41.3 ms1032 bytes from 114.250.65.34 (114.250.65.34): icmp_seq=3 ttl=128 time=41.5 ms1032 bytes from 114.250.65.34 (114.250.65.34): icmp_seq=4 ttl=128 time=41.1 ms^C--- g.cn ping statistics ---4 packets transmitted, 4 received, 0% packet loss, time 9014msrtt min/avg/max/mdev = 41.125/41.766/43.096/0.794 ms# -i 3 发送周期为 3秒 -s 设置发送包的大小 -t 设置TTL值为 255

top命令

top命令主要用于查看进程的相关信息,同时它也会提供系统平均负载,cpu 信息和内存信息。

语法

top [-] [d delay] [q] [c] [S] [s] [i] [n] [b]

参数说明

  • d : 改变显示的更新速度,或是在交谈式指令列( interactive command)按s
  • q : 没有任何延迟的显示速度,如果使用者是有 superuser 的权限,则 top 将会以最高的优先序执行
  • c : 切换显示模式,共有两种模式,一是只显示执行档的名称,另一种是显示完整的路径与名称
  • S : 累积模式,会将己完成或消失的子行程 ( dead child process ) 的 CPU time 累积起来
  • s : 安全模式,将交谈式指令取消, 避免潜在的危机
  • i : 不显示任何闲置 (idle) 或无用 (zombie) 的行程
  • n : 更新的次数,完成后将会退出 top
  • b : 批次档模式,搭配 "n" 参数一起使用,可以用来将 top 的结果输出到档案内

常用实例

显示进程信息

[root@oracle_db ~]# toptop - 09:15:54 up  9:36,  2 users,  load average: 0.14, 0.09, 0.06   # 系统平均负载Tasks: 278 total,   3 running, 275 sleeping,   0 stopped,   0 zombie # 任务信息汇总%Cpu(s):  0.3 us,  1.0 sy,  0.0 ni, 98.0 id,  0.0 wa,  0.3 hi,  0.3 si,  0.0 st  #CPU 信息MiB Mem :   3709.9 total,   1073.3 free,   1278.1 used,   1358.5 buff/cache  # 内存信息MiB Swap:   4046.0 total,   4046.0 free,      0.0 used.   2109.6 avail Mem      # 内存信息    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND  # 任务详情 197201 root      20   0  275316   5328   4468 R   0.7   0.1   0:00.05 top      1 root      20   0  187076  15224   9816 S   0.0   0.4   0:06.03 systemd      2 root      20   0       0      0      0 S   0.0   0.0   0:00.02 kthreadd      3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp      4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_par_gp      6 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/0:0H-events_highpri      9 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 mm_percpu_wq     10 root      20   0       0      0      0 S   0.0   0.0   0:01.01 ksoftirqd/0      # 输出中的第一行是系统的平均负载,这和 uptime 命令的输出是一样的 [root@oracle_db ~]# uptime 09:24:49 up  9:45,  2 users,  load average: 0.29, 0.27, 0.17 09:24:49  表示系统当前时间。 up  9:45  表示系统最后一次启动后总的运行时间。 2 users   表示当前系统中有2个登录用户。 load average: 0.29, 0.27, 0.17 表示系统的平均负载,最后的三个数字分别表示最后一分钟的系统平均负载,最后五分钟的系统平均负载,最后十五分钟的系统平均负载。小写字母 i 可以控制是否显示系统平均负载信息。# 第二行信息是对当前系统中所有任务的统计:在 linux 系统中,一般把进程和线程统称为任务。Tasks:278 total 表示当前系统的进程总数。3 running 表示当前系统中有 3个正在运行的进程。275 sleeping 表示当前系统中有 269 个休眠的进程。0 stopped 表示停止状态的进程数为 0。0 zombie 表示处于僵死状态的进程数为 0。# 第三行显示 CPU 的使用情况:此处一共有八个字段,是我们了解 CPU 负载的主要依据。us:进程在用户地址空间中消耗 CPU 时间的百分比。sy:进程在内核地址空间中消耗 CPU 时间的百分比。ni:是 nice 的缩写,可以通过 nice 值调整进程用户态的优先级。id:CPU 处于 idle 状态的百分比。一般情况下, us + ni + id 应该接近 100%。wa:CPU 等待磁盘 IO 操作的时间。hi & si:这两个值表示系统处理中断消耗的时间。中断分为硬中断和软中断,hi 表示处理硬中断消耗的时间,si 表示处理软中断消耗的时间。硬中断是硬盘、网卡等硬件设备发送给 CPU 的中断消息,当 CPU 收到中断消息后需要进行适当的处理(消耗 CPU 时间)。软中断是由程序发出的中断,最终也会执行相应的处理程序(消耗 CPU 时间)。st:只有 Linux 在作为虚拟机运行时 st 才是有意义的。它表示虚机等待 CPU 资源的时间(虚机分到的是虚拟 CPU,当需要真实的 CPU 时,可能真实的 CPU 正在运行其它虚机的任务,所以需要等待)。

显示完整命令

[root@oracle_db ~]# top -ctop - 09:17:30 up  9:38,  2 users,  load average: 0.20, 0.16, 0.09Tasks: 278 total,   3 running, 275 sleeping,   0 stopped,   0 zombie%Cpu(s):  0.0 us,  0.7 sy,  0.0 ni, 99.0 id,  0.0 wa,  0.3 hi,  0.0 si,  0.0 stMiB Mem :   3709.9 total,   1074.1 free,   1277.3 used,   1358.5 buff/cacheMiB Swap:   4046.0 total,   4046.0 free,      0.0 used.   2110.3 avail Mem    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND   2628 julyc     20   0  745056  40092  32248 S   0.3   1.1   0:22.33 /usr/bin/vmtoolsd -n vmusr --uinputFd 3 188635 root      20   0  429368  42828  10724 S   0.3   1.1   0:00.85 /usr/libexec/sssd/sssd_kcm --uid 0 --gid 0 --logg+ 189367 root      20   0  222648   3232   2896 S   0.3   0.1   0:01.68 bash -c while true; do sleep 1;head -v -n 8 /proc+ 197690 root      20   0  275348   5376   4524 R   0.3   0.1   0:00.11 top -c      1 root      20   0  187076  15224   9816 S   0.0   0.4   0:06.03 /usr/lib/systemd/systemd --switched-root --system+      2 root      20   0       0      0      0 S   0.0   0.0   0:00.02 [kthreadd]      3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 [rcu_gp]      4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 [rcu_par_gp]      6 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 [kworker/0:0H-events_highpri]      9 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 [mm_percpu_wq]     10 root      20   0       0      0      0 S   0.0   0.0   0:01.02 [ksoftirqd/0]

以批处理模式显示程序信息

[root@oracle_db ~]# top -btop - 09:18:34 up  9:39,  2 users,  load average: 0.07, 0.13, 0.09Tasks: 278 total,   1 running, 277 sleeping,   0 stopped,   0 zombie%Cpu(s):  5.6 us,  5.6 sy,  0.0 ni, 88.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 stMiB Mem :   3709.9 total,   1074.4 free,   1277.1 used,   1358.5 buff/cacheMiB Swap:   4046.0 total,   4046.0 free,      0.0 used.   2110.6 avail Mem    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND 198301 root      20   0  275336   5320   4520 R   6.2   0.1   0:00.01 top      1 root      20   0  187076  15224   9816 S   0.0   0.4   0:06.03 systemd      2 root      20   0       0      0      0 S   0.0   0.0   0:00.02 kthreadd      3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp      4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_par_gp      6 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/0:0H-events_highpri      9 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 mm_percpu_wq

以累积模式显示程序信息

 [root@oracle_db ~]# top -Stop - 09:19:56 up  9:40,  2 users,  load average: 0.04, 0.11, 0.08Tasks: 278 total,   2 running, 276 sleeping,   0 stopped,   0 zombie%Cpu(s):  0.7 us,  1.3 sy,  0.0 ni, 97.4 id,  0.0 wa,  0.3 hi,  0.3 si,  0.0 stMiB Mem :   3709.9 total,   1074.2 free,   1277.2 used,   1358.5 buff/cacheMiB Swap:   4046.0 total,   4046.0 free,      0.0 used.   2110.5 avail Mem    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND     11 root      20   0       0      0      0 I   0.3   0.0   0:02.20 rcu_sched    968 dbus      20   0   94220   7984   5144 S   0.3   0.2   0:06.62 dbus-daemon   1349 apache    20   0 1347740  13936   6780 S   0.3   0.4   0:05.31 httpd 189367 root      20   0  222648   3232   2896 S   0.3   0.1   0:08.86 bash      1 root      20   0  187076  15224   9816 S   0.0   0.4  12:36.04 systemd      2 root      20   0       0      0      0 S   0.0   0.0   0:00.02 kthreadd      3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp      4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_par_gp      6 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/0:0H-events_highpri      9 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 mm_percpu_wq     10 root      20   0       0      0      0 S   0.0   0.0   0:01.02 ksoftirqd/0

设置信息更新次数

top -n 2 # 表示更新两次后终止更新显示

设置信息更新时间

top -d 3  # 表示更新周期为3秒

显示指定的进程信息

[root@oracle_db ~]# top -p 139top - 09:22:16 up  9:42,  2 users,  load average: 0.46, 0.29, 0.16Tasks:   0 total,   0 running,   0 sleeping,   0 stopped,   0 zombie%Cpu(s): 73.6 us,  6.4 sy,  0.0 ni, 19.6 id,  0.0 wa,  0.3 hi,  0.0 si,  0.0 stMiB Mem :   3709.9 total,    900.2 free,   1451.2 used,   1358.5 buff/cacheMiB Swap:   4046.0 total,   4046.0 free,      0.0 used.   1936.5 avail Mem    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND

使用者将不能利用交谈式指令来对行程下命令

top -s

rm 命令

用于删除一个文件或者目录。

语法

rm [参数] name...

参数

  • -i 删除前逐一询问确认。
  • -f 即使原档案属性设为唯读,亦直接删除,无需逐一确认。
  • -r 将目录及以下之档案亦逐一删除。

常用实例

删除文件可以直接使用rm命令,若删除目录则必须配合选项"-r",例如:

# rm  test.txt rm:是否删除 一般文件 "test.txt"? y  # rm  homework  rm: 无法删除目录"homework": 是一个目录  # rm  -r  homework  rm:是否删除 目录 "homework"? y 

删库跑路 sudo rm -rf /*

rm -rf命令是删除文件夹及其内容的最快方法之一。但一个标点错误就可能会导致不可恢复的系统损坏。

文件一旦通过rm命令删除,则无法恢复,所以必须格外小心地使用该命令。

rm -r         # 命令以递归方式删除文件夹,甚至是空文件夹。rm -f         # 命令在不询问的情况下删除“只读文件”。rm -rf /     # 强制删除根目录中的所有内容。rm -rf *     # 强制删除当前目录/工作目录中的所有内容rm -rf.       # 强制删除当前文件夹和子文件夹。rm -rf ~    # 将删除主文件夹中的所有文件,rm -rf .*    # 将删除所有配置文件。

ln 命令

ln(link files)是一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接。ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化。

当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在 其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。

语法

 ln [参数][源文件或目录][目标文件或目录]

功能 :
Linux文件系统中,有所谓的链接(link),我们可以将其视为档案的别名,而链接又可分为两种 : 硬链接(hard link)软链接(symbolic link),硬链接的意思是一个档案可以有多个名称,而软链接的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置。硬链接是存在同一个文件系统中,而软链接却可以跨越不同的文件系统。 不论是硬链接或软链接都不会将原本的档案复制一份,只会占用非常少量的磁碟空间。

image软链接

    1. 软链接是一个包含了路径信息的独立文件,类似于 Windows 的快捷方式,它的许多属性依赖于原文件,所以给软链接文件设置权限是没有意义的;
    1. 软链接可以跨文件系统,但硬链接不能跨文件系统,因为硬链接只是文件的别名,而非独立的文件;
    1. 创建软链接时,目标文件可以不存在;创建硬链接时,每个目标必须存在;
    1. 软链接可以对目录进行链接。

硬链接

    1. 硬链接,以文件副本的形式存在。但不占用实际空间;
    1. 不允许给目录创建硬链接,因为硬链接连接到目录可会导致目录的 inode 与实体 block 形成环状。此时,如果删除目录,会导致目录实体 block 无法被系统访问,产生孤立的目录(从根目录无法再访问);
    1. 硬链接只有在同一个文件系统中才能创建;
    1. 硬链接的限制比较多,既不能跨文件系统,也不能链接目录,而且源文件和硬链接文件之间除 inode 号是一样的之外,没有其他明显的特征。这些特征都使得硬链接并不常用,有所了解就好。

命令参数

必要参数

  • -s 建立软链接文件。如果不加 "-s" 选项,则建立硬链接文件;
  • -f 强制。如果目标文件已经存在,则删除目标文件后再建立链接文件;
  • -b 删除,覆盖以前建立的链接
  • -d 允许超级用户制作目录的硬链接
  • -i 交互模式,文件存在则提示用户是否覆盖
  • -n 把符号链接视为一般目录
  • -v 显示详细的处理过程

常用实例

创建硬链接

[root@oracle_db ~]# touch test  #建立源文件[root@oracle_db ~]# ln /root/test /tmp/test-hard 给源文件建立硬链接文件 [root@oracle_db ~]#  ll -i /root/test /tmp/test-hard67429534 -rw-r--r--. 2 root root 0 Aug 24 10:40 /root/test67429534 -rw-r--r--. 2 root root 0 Aug 24 10:40 /tmp/test-hard#查看两个文件的详细信息,可以发现这两个文件的 inode 号是一样的,"ll"等同于"ls -l"。

注:每个文件的 inode 号都应该是不一样的。inode 号就相当于文件 ID,我们在查找文件的时候,要先查找 inode 号,才能读取到文件的内容。

创建软链接

[root@oracle_db ~]# touch check  # 建立源文件[root@oracle_db ~]# ln -s /root/check /tmp/check-soft  #建立软链接文件[root@oracle_db ~]# ll -id /root/check /tmp/check-soft67426414 -rw-r--r--. 1 root root  0 Aug 24 10:38 /root/check33582313 lrwxrwxrwx. 1 root root 11 Aug 24 10:38 /tmp/check-soft -> /root/check# 软链接和源文件的 inode 号不一致,软链接的标志非常明显,首先,权限位中"l"表示这是一个软链接文件;其次,在文件的后面通过 "->" 显示出源文件的完整名字。# 在软链接的权限位 lrwxrwxrwx 中,l 就代表软链接文件

注意,软链接文件的源文件必须写成绝对路径,而不能写成相对路径(硬链接没有这样的要求);否则软链接文件会报错。

软链接的特性

  • 修改源文件,不论是源文件还是软链接文件,数据都发生改变
  • 修改软链接文件,不论是源文件还是软链接文件,数据也都会发生改变
  • 删除源文件,软链接无法正常使用
[root@oracle_db ~]# echo july >> /root/check[root@oracle_db ~]# cat checkjuly[root@oracle_db ~]# cat /tmp/check-softjuly# 修改源文件,不论是源文件还是软链接文件,数据都发生改变[root@oracle_db ~]# echo Youngs >>  /tmp/check-soft[root@oracle_db ~]# cat /root/checkjulyYoungs# 不论是源文件还是软链接文件,数据也都会发生改变[root@oracle_db ~]# rm -rf /root/check  [root@oracle_db ~]# cat /tmp/check-soft  cat: /tmp/check-soft: No such file or directory# 删除源文件,软链接无法正常使用

软链接链接目录

[root@localhost ~]# mkdir test  # 建立源目录[root@oracle_db ~]#  ln -s /root/test/ /tmp/ [root@oracle_db ~]# ll -d /tmp/testlrwxrwxrwx. 1 root root 11 Aug 24 10:53 /tmp/test -> /root/test/ # 软链接可以链接目录

find 命令

find 命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。

语法

find命令的常用形式

find [path...] [expression]
  • path:find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录

  • expression:expression可以分为——'-options [-print -exec -ok ...]' 即:

    find   path   -option   [ -print ]   [ -exec   -ok   command ]   {}  \;            注意{}和\;之间的空格; {}中没有空格。“;”分号需要。
    

    参数说明 :

    • -options

      指定find命令的常用选项,下面详细介绍

    • -print

      find命令将匹配的文件输出到标准输出

    • -exec

      find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为:`   command {}  \;   ` find ./ -size 0 -exec rm  {} \;          删除文件大小为零的文件  find  . -type f -exec ls -l {} \;          为了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在find命令的-exec选项中find /logs -type f -mtime +5 -exec rm {} \;    在/logs目录中查找更改时间在5日以前的文件并删除它们
      
    • -ok

      -exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
      find . -name "*.conf" -mtime +5 -ok rm {} \; 在当前目录中查找所有文件名以.conf结尾、更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示

有人这样总结find命令的结构,我觉得很好:

find  start_directory              options              criteria_to_match              action_to_perform_on_results

常用参数选项说明及实例

  • -name
    按照文件名查找文件名称符合name的文件。-iname 则会忽略大小写;
    find /dir -name july /dir目录及其子目录下面查找名字为july的文件 ;
    find . -name "*.txt" 在当前目录及其子目录(用“.”表示)中查找任何扩展名为“txt”的文件;

  • **-perm **
    按照文件权限来查找文件。
    find . -perm 755 -print 在当前目录下查找文件权限位为755的文件,即文件属主可以读、写、执行,其它用户可以读、执行的文件

  • -prune
    使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。
    find /apps -path "/apps/bin" -prune -o -print 在/apps目录下查找文件,但不希望在/apps/bin目录下查找
    find /usr/julyc -path "/usr/julyc/dir1" -prune -o -print 在/usr/julyc目录下查找不在dir1子目录之内的所有文件

  • -user
    按照文件属主来查找文件。
    find 。 -user julyc -print 在当前目录及其子目录中查找文件属主为julyc的文件

  • -group
    按照文件所属的组来查找文件。
    find /apps -group gem -print 在/apps目录下查找属于gem用户组的文件

  • -mtime -n +n File's data was last modified n*24 hours ago.
    按照文件的更改时间来查找文件, -n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前。
    find / -mtime -5 -print 在系统根目录下查找更改时间在5日以内的文件
    find /var/adm -mtime +3 -print 在/var/adm目录下查找更改时间在3日以前的文件

  • -ctime -n File's status was last changed n*24 hours ago.

    find . -ctime -20 将当前目录及其子目录下所有最近 20 天内更新过的文件列出;

    更多的时间文件查找项目

    • -amin -n : 在过去 n 分钟内被读取过

    • -anewer file : 比文件 file 更晚被读取过的文件

    • -atime -n : 在过去n天内被读取过的文件

    • -cmin -n : 在过去 n 分钟内被修改过

    • -cnewer file :比文件 file 更新的文件

    • -ctime -n : 在过去n天内被修改过的文件

  • -nogroup
    查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。
    find / -nogroup -print

  • -nouser
    查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
    find /home -nouser -print

  • -newer file1 ! file2
    查找更改时间比文件file1新但比文件file2旧的文件。

  • -type
    查找某一类型的文件,诸如:
    b - 块设备文件。
    d - 目录。
    c - 字符设备文件。
    p - 管道文件。
    l - 符号链接文件。
    f - 普通文件。
    find /etc -type d -print 在/etc目录下查找所有的目录
    find . ! -type d -print 在当前目录下查找除目录以外的所有类型的文件
    find /etc -type l -print 在/etc目录下查找所有的符号链接文件

  • -size n :[cbkw]查找文件长度为n块的文件,带有c表示文件长度以字节计, b 代表 512 位元组的区块,k为kb,w 是二个位元组。

    find /home/julyc -size 100w -print 在/home/julyc目录下查找文件长度恰好为100w的文件

    find . -size +1000000c -print 在当前目录下查找文件长度大于1 M字节的文件
    find /home/julyc -size 100c -print 在/home/julyc目录下查找文件长度恰好为100字节的文件
    find . -size +10 -print 在当前目录下查找长度超过10块的文件(一块等于512字节)

  • -depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
    find / -depth -name "CON.FILE" -print 它将首先匹配所有的文件然后再进入子目录中查找

  • -mount:在查找文件时不跨越文件系统mount点。
    find . -mount -name "*.XC" -print 从当前目录开始查找位于本文件系统中文件名以XC结尾的文件(不进入其它文件系统)

  • -follow:如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。

find与xargs

在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。

find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。

在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。

xargs配合find命令一起使用的一些例子:

find . -type f -print | xargs file 查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件

find / -name "core" -print | xargs echo "" >/tmp/core.log 在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中:

find . -type f -print | xargs grep "hostname" 用grep命令在所有的普通文件中搜索hostname这个词

find ./ -mtime +3 -print|xargs rm -f –r 删除3天以前的所有东西,或:find . -ctime +3 -exec rm -rf {} \;

find ./ -size 0 | xargs rm -f & 删除文件大小为零的文件

find命令配合使用exec和xargs可以使用户对所匹配到的文件执行几乎所有的命令。


grep sed awk 三剑客

Linux三剑客是(grepsedawk)三者的简称,熟练使用这三个工具可以提升运维效率。Linux三剑客以正则表达式作为基础,而在Linux系统中,支持两种正则表达式,分别为“标准正则表达式”和“扩展正则表达式”。

一、正则表达式

正则表达式:REGular EXPression, REGEXP。通过特定的字符串匹配模板,来获取到所需的内容。熟练掌握好正则表达式是使用Linux三剑客的前提啊。

元字符

.: 匹配任意单个字符;
[]: 匹配指定范围内的任意单个字符;
[^]:匹配指定范围外的任意单个字符;

字符集合

[[:digit:]]:匹配单个数字;
[[:lower:]]:匹配单个小写字母;
[[:upper:]]:匹配单个大写字母;
[[:punct:]]:匹配单个标点字符;
[[:space:]]:匹配单个空白字符;
[[:alpha:]]:匹配单个字母;
[[:alnum:]]:匹配单个字母或数字;

匹配次数(贪婪模式)

*:匹配其前面的字符任意次
?:匹配其前面的字符0次或者1次
+:匹配其前面的字符至少1次
.*:任意长度的任意字符

位置锚定

^: 锚定行首,此字符后面的任意内容必须出现在行首
$: 锚定行尾,此字符前面的任意内容必须出现在行尾
^$: 空白行

LInux实际使用

由于linux系统shell解释器的特殊处理,某些元字符在linux下具有展开式等特殊含义,在实际的使用过程中我们需要添加\进行转义。

\?:匹配其前面的字符1次或0次;

\+:匹配至少一次;

\{m,n\}:匹配其前面的字符至少m次,至多n次;

\{1,\}:匹配前面的字符至少1次;
\{0,3\}:匹配前面的字符0次至3次均可;

备注:至少0次,必须要显示的写出来;

\<或\b:锚定词首,其后面的任意字符必须作为单词首部出现
\>或\b:锚定词尾,其前面的任意字符必须作为单词的尾部出现

分组与后向引用

\(\)
\(ab\)*
\1:引用第1个左括号以及与之对应的括号所包括的所有内容;
\2:引用第2个左括号以及与之对应的括号所包括的所有内容,以此类推;

二、拓展正则表达式

可以看到标准正则表达的使用过程中,许多符号都需要转义,这在工作中带来了一定的不便,因此扩展的正则表达式便出现了。

字符匹配:

.:匹配单个字符;
[abc]:包含abc任意一个字符
[^abc]:不包含abc任意一个字符

次数匹配(不用再转义):

*:匹配前一个字符任意次;
?:匹配其前面的字符1次或0次;
+:匹配其前面的字符至少1次;
{m,n}:匹配其前面的字符至少m次,至多n次;

位置锚定:

对比使用方式:^$
这里要注意的是对于词首定位和词尾定位,分别是\<\>,依然需要加上反斜杠;

分组(不用再转义):

():分组
\1, \2, \3:分别对应第n个括号所匹配的内容;

或运算

|: 可以同时取并集;

注意:C|cat表示的是C或cat(表示的是整个部分)

可以看到,使用扩展的正则表达式可以省略很多的转义符号,这尤其在写sed语句时极大的提高了代码的可读性。建议优先使用扩展的正则表达式。

三、grep命令

grep命令的由来可以追溯到 UNIX 诞生的早期,在 UNIX 系统中,搜索的模式(patterns)被称为正则表达式(regular expressions),为了要彻底搜索一个文件,有的用户在要搜索的字符串前加上前缀 global(全面的),一旦找到相匹配的内容,用户就像将其输出(print)到屏幕上,而将这一系列的操作整合到一起就是 global regular expressions print,即 grep 命令的全称。

3.1. grep相关命令

grep命令家族由grep, egrep, fgrep 三个子命令组成,适用于不同的场景。具体如下:

命令描述

grep 原生的grep命令,使用“标准正则表达式”作为匹配标准。最常用!
egrep 扩展的grep命令,相当于$(grep -E),使用“扩展正则表达式”作为匹配标准。
fgrep 简化版的grep命令,不支持正则表达式,但搜索速度快,系统资源使用率低。

3.2. 使用方法

语法

grep [选项] 模式 文件名

grep [options] PATTERN [FILE...]

options部分
-i:忽略大小写
--color:高亮匹配上的字符串
-v: 显示没有被模式匹配到的行
-o:只显示被模式匹配到的字符串
-E:使用扩展的正则表达式,egrep=grep -E

PATTERN部分
以字符串的方式给定匹配模板,可以使用普通字符串以及正则表达式(标准&扩展)。

FILE部分
需要查找内容的文件。

四、sed命令

4.1. 概述

sed全称为Stream EDitor,sed是一个流编辑器,在处理行内容时功能十分强大。

4.2 基本语法

sed [option] 'script' [input file]...sed [选项] [脚本命令] 文件名

1.option部分

选项 含义
-e 脚本命令 该选项会将其后跟的脚本命令添加到已有的命令中。
-f 脚本命令文件 该选项会将其后文件中的脚本命令添加到已有的命令中。
-n 默认情况下,sed 会在所有的脚本指定执行完毕后,会自动输出处理后的内容,而该选项会屏蔽启动输出,需使用 print 命令来完成输出。
-i 此选项会直接修改源文件,要慎用。
-r 支持使用扩展的正则

2.script部分

script部分包含两个内容,其一是定界,即确定我们要操作的范围。另一个内容是操作,比如替换、插入当前行或在后面插入等操作。

a)定界-空地址

即全文编辑;​​

b)定界-单地址:

n:指定第n行,对特定行进行编辑;举例:sed -n '1p' passwd 仅输出第一行;
/pattern/:指定模式匹配到的那一行,注意这里的pattern不是扩展正则表达式,如果要用扩展的正则表达式,需要在option需要使用-r;举例:sed -n '/sbin/p' passwd 输出能够匹配上sbin的内容行;

c)定界-范围:

n,m:定位从第n行开始至第m行(都是闭区间);
n,+k:定位从第n行开始,包括往后的k行;
n,/pattern/:定位从第n行开始,至指定模式匹配到的那一行;
/pattern1/,/pattern2/:定位从pattern1模式匹配开始,直到pattern2模式匹配之间的范围;

d)定界-步进方式:

1~2:以1为起始行,然后步进2行向下匹配,即所有的奇数行;
2~2:以2为起始行,然后步进2行向下匹配,即所有的偶数行;

e)编辑操作:

d:删除整行,d放在定界后面。举例:sed '/sbin/d' passwd
p:显示模式空间中的内容, p放在定界后面。一般来说,p操作和-n选项配合使用,筛选出我们匹配的行。若不加-n的话,由于模式空间中未匹配上的行也会输出,我们会发现所有内容都输出并且匹配行会输出2次;
a:在匹配的行后面增加文本,使用\n支持多行追加,a放在定界后面。举例:sed '1a first_line\nsecond_line' passwd 在第1行后面插入两行内容(first_line 和 second_line);
i:在匹配的行前面增加文本,i放在定界后面。举例:sed '3i hello' passwd
c:替换匹配行为指定的文本。举例:sed '/root/c text' passwd 把匹配到的行替换成text;
w:保存模式空间中匹配的内容到指定位置。举例:sed -n '/^[^#]/w /tmp/demo' /etc/fstab 即将/etc/fstab中非#开头的行输出保存到/tmp/demo中。
r:读取指定文件的内容添加到当前文件匹配到的行后面,进行文件合并。举例:sed '2r /etc/passwd' 1.txt 即将/etc/passwd文件的内容读取,并插入到1.txt文件的第二行处。
!:条件取反。用法:地址定界!编辑命令。
s///:条件替换,这里的/可以用其他特殊符号,其替换分隔符的判定标准是s字符后的第一个特殊符号。这在替换文本中涉及特殊符号时特别好使,我们避开需要替换的特殊符号即可。即sed 's@root@me@g' /etc/passwd 等同于 sed 's/root/me/g' /etc/passwd

替换标记备注:g(全局替换),p(显示替换成功的行)
替换举例:根据输入查找目录,下面输出的是/var/log/
echo "/var/log/messages" | sed 's@[^/]\+$/\?@@'

4.3.sed高级用法

1.模式空间与保持空间

img

在模式空间中,完成匹配的操作。当没有匹配上的时候,文本行内容会默认输出stdout;当匹配上文本行的时候,会执行编辑命令,执行结果输出到stdout中。
保持空间可以理解为一个暂存区,只是用于完成额外的动作。

2.相关参数

h:把模式空间中的内容覆盖至保持空间中;
H:把模式空间中的内容追加至保持空间中;
g:把保持空间中的内容覆盖至模式空间中;
G:把保持空间中的内容追加至模式空间中;
x:把模式空间中的内容与保持空间中的内容互换;
n:覆盖读取匹配到的行的下一行(改变指向)至模式空间中;
N:追加读取匹配到的行的下一行(改变指向)至模式空间中;
d:删除模式空间中的行;
D:删除多行模式空间中的所有行;

3.举例

sed -n 'n;p' FILE:显示偶数行;
sed '1!G;h;$!d' FILE:逆序显示文件的内容;
sed '$!d' FILE:取出最后一行;
sed '\$!N;$!D' FILE:取出文件后两行;
sed '/^$/d;G' FILE:删除原有的所有空白行,而后为所有的非空白行后添加一个空白行;
sed 'n;d' FILE:显示奇数行;
sed 'G' FILE:在原有的每行后方添加一个空白行;

4.基础试题举例

试题1:提取字符串中的指定字符串

 /bin/bashinfo="hellozimskyshenzhen"echo $info | sed 's/hello\(\w\+\)shenzhen/\1/g'

注意事项:
sed中不支持\d,如果要用数字用[0-9],但是支持\w。
在一般正则表达式中,sed中的()要转义,+要转义,<>要使用\转义。如果不想这么麻烦,那就加上-r选项使用扩展正则表达式吧!

试题2:判断输入是否为整数

#!/bin/bashif [ -n "$(echo $1 | sed -n '/^[0-9]\+$/p')" ] ; then  echo 'yes'else  echo 'no'fi

五、awk命令

5.1. awk概述

awk是发明该工具三个作者姓名的首字母简称,awk是一个报表生成器,主要用于格式化输出。格式化文本输出器。

5.2. 基本用法

1.语法

awk [option] 'PATTERN{ACTION STATEMENTS}' FILE

awk [选项] '脚本命令{'匹配规则{执行命令}'}' 文件名

在awk中,默认的字段分隔符是任意的空白字符(例如空格或制表符)。在文本行中,每个数据字段都是通过字段分隔符划分的。awk在读取一行文本时,会用预定义的字段分隔符划分每个数据字段。即awk按照行来读取文档,根据输入分隔符切分成小部分(用內建变量来表示$0,$1,$2等),用ACTION STATEMENTS来处理该行文本。默认情况下,awk会将如下变量分配给它在文本行中发现的数据字段:

  • $0 代表整个文本行;
  • $1 代表文本行中的第 1 个数据字段;
  • $2 代表文本行中的第 2 个数据字段;
  • $n 代表文本行中的第 n 个数据字段。

2.常用选项option

选项 含义
-F fs 指定以 fs 作为输入行的分隔符,awk 命令默认分隔符为空格或制表符。
-f file 从脚本文件中读取 awk 脚本指令,以取代直接在命令行中输入指令。
-v var=value 在执行处理过程之前,设置一个变量 var,并给其设备初始值为 val。

awk的强大之处在于脚本命令,它由2部分组成,分别为匹配规则和执行命令,如下所示:

'匹配规则{执行命令}'

这里的匹配规则,和sed命令中的address部分作用相同,用来指定脚本命令可以作用到文本内容中的具体行,可以使用字符串(比如/demo/,表示查看含有demo字符串的行)或者正则表达式指定。另外需要注意的是,整个脚本命令是用单引号('')括起,而其中的执行命令部分需要用大括号({})括起来。

在awk程序执行时,如果没有指定执行命令,则默认会把匹配的行输出;如果不指定匹配规则,则默认匹配文本中所有的行。举例:

[root@localhost ~]# awk '/^$/ {print "Blank line"}' test.txt

在此命令中,/^$/是一个正则表达式,功能是匹配文本中的空白行,同时可以看到,执行命令使用的是 print 命令,此命令经常会使用,它的作用很简单,就是将指定的文本进行输出。因此,整个命令的功能是,如果test.txt有 N 个空白行,那么执行此命令会输出N个Blank line。

3.PATTERN(用于定界)

``:表示处理文件的所有行;

/pattern/:表示处理正则匹配对应的行;
!/pattern/:表示处理正则不匹配的行;
关系表达式:比如NR>2等返回布尔类型的表达式。若结果为真则处理,假则不处理。对于非0非空字符串为真,其余为假。
n:表示处理第n行的文本,注意这里不支持直接给出数字的格式,例如1,2{...}。详情请见举例。
BEGIN/END模式:BEGIN{}表示仅在开始处理文件中的文本之前执行一次的程序,例如打印表头。END{}表示文本处理完成之后执行一次,例如汇总数据。

举例:# 在/etc/passwd文件中,以:为分隔符,筛选出最后一列为/bin/bash的行,并打印第一列和最后一列awk -F: '$NF=="/bin/bash" {print $1, $NF}' /etc/passwdawk -F: '$NF!="/bin/bash"{print $1,$NF}' passwdawk -F: '$3<1000 {print $1, $3}' /etc/passwdawk -F; '(NR>=2&&NR<=10){print $1}' /etc/passwd 行定界awk -F: '{printf "%-15s %10s\n", $1, $2}' /etc/passwd

4.內建变量

(在引用变量时不用加$)

FS:input field seperator:输入字段分隔符,默认空白字符。也可使用-v指定。
OFS:输出字段分隔符。使用-v指定。
RS:输入时的换行符
ORS:输出时的换行符
NF:number of field 每一行的字段数量。加上$NF表示最后一列
NR:number of record 文件的行数,打印出来是打印行号
FNR:多个文件中的行数分别计数
FILENAME:当前文件的文件名
ARGC:参数命令行中参数的个数
ARGV:返回数组,命令行中的每个参数

举例:awk 'BEGIN {print ARGV[0]}' /etc/fstab /etc/issue在这里ARGV[0]是awk,固定为第0个参数。ARGV[1]是/etc/fstab,ARGV[2]是/etc/issue举例:awk -v FS=':' '{print $1}' -v OFS=':' /etc/passwd 指名冒号作为输入的分隔符。同awk -F: ...

5.自定义变量

方法1:-v var=value (区分字符的大小写)
方法2:在program中定义

举例:awk -v test='hello' 'BEGIN {print test}'awk 'BEGIN {test='hello' print test}'

6.常用的ACTION命令

  • print
    输出格式:print item1,item2 ...
    备注:使用逗号作为分隔符;输出item可以是字符串、內建变量、awk表达式;若省略item,则显示$0整行;

  • printf
    格式化输出:printf FORMAT, item1, item2...按位放在format中。
    注意事项:format必须要给出;如需换行,必须要显示写出;format中需要为后面每个item指定格式符;

  • Expressions

  • Control statements:控制语句if,while

    if(condition){statement}if(condition){statement} else {statements}while(condition) {statements}do {statements} while(condition)for(expr1;expr2;expr3) {statements}breakcontinuedelete array[index]delete array删除整个数组exit 退出语句
    
  • Compound statements:组合语句

  • Input statements:输入语句

  • Output statements:输出语句
    格式符
    %c:显示字符的ASCII值
    %d:显示十进制整数
    %e:科学计数法数值显示
    %f:显示为浮点数
    %g:以科学计数法显示浮点数
    %s:显示字符串
    %u:显示无符号整数
    %%:显示%自身

    修饰符
    #[.#]:第一个数字用于控制显示字符的宽度,第二个数字表示小数的精度(对于浮点数而言);输出默认右对齐%15s,左对齐:%-15s;+:表示带正负符号;

    操作符
     算数操作符:+-/* ; +x把字符串转换成数值;-x改成负数;
     字符串操作符:字符串连接(没有操作符)
     复制操作符:=,+=,-=,/=,++,--
     比较操作符:>,<,<=,!=,==
    模式匹配符
    ~: 左侧的字符串是否被模式匹配
    !~:左侧的字符串是否不能被模式匹配
    逻辑操作符
     &&:与
     ||:或
     !:非
    函数调用

    function_name(arg1, arg2, ...)
    

    条件表达式
    selector ? true_exp : false_exp 和三目运算符一样

  • 操作例子

# 一般来说, 打印无状态内容放在BEGIN和END块中awk -v begin="hello" -v end="ok" -F: 'BEGIN{print begin}; {print $1, $NF}; END{print end}' /etc/passwd

5.3. awk高级用法及举例

1. awk常用内置变量

$1:表示第一列$NF:表示最后一列$NR:表示行号

2. 常用条件表示

  1. /指定内容/
    这种方式可以匹配到含有“指定内容”的行,在条件中不添加$#所带的项,建议不使用正则,有异常情况。
awk -F: '/nologin/{print $0}' /etc/passwd #匹配到含有nologin关键字的行seq 100 | awk '/1/{print $1}'
  1. $#=/指定内容/
    这种方式指定第#列匹配指定内容
awk -F: '$1=/bin/{print $0}' /etc/passwd
  1. $#~/指定内容/
    这种方式用于指定列模糊匹配(正则匹配)指定内容,并获取该行。
awk -F: '$1~/dae/{print $1}' /etc/passwd  #正向选择awk -F: '$1!~/dae/{print $1}' /etc/passwd #反向选择
  1. 值判断
    使用>,<,>=,<=,==,!=来判断指定列的值。
awk -F: '$3>=10{print $1}' /etc/passwd
  1. 逻辑判断
    使用&&,||来进行逻辑判断。
awk -F: '$3>=5 && $3<=10{print $1}' /etc/passwd
  1. if条件判断
awk -F: '{if ($NF~/nologin$/){i++}else{j++}}; END{print i, j}' /etc/passwd#注意if-else条件判断是放在{}中的

vi/vim

所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在。但是目前使用比较多的是 vim 编辑器。

vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计。--本节内容来自菜鸟教程,搬运整理

相关文章:史上最全Vim快捷键键位图 — 入门到进阶


什么是 vim?

Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。

简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具。

连 vim 的官方网站 (http://www.vim.org) 自己也说 vim 是一个程序开发工具而不是文字处理软件。

vim 键盘图:

image

vi/vim 的使用

基本上 vi/vim 共分为三种模式,分别是命令模式(Command mode)输入模式(Insert mode)底线命令模式(Last line mode)。 这三种模式的作用分别是:

命令模式:

用户刚刚启动 vi/vim,便进入了命令模式。

此状态下敲击键盘动作会被Vim识别为命令,而非输入字符。比如我们此时按下i,并不会输入一个字符,i被当作了一个命令。

以下是常用的几个命令:

  • i 切换到输入模式,以输入字符。
  • x 删除当前光标所在处的字符。
  • : 切换到底线命令模式,以在最底一行输入命令。

若想要编辑文本:启动Vim,进入了命令模式,按下i,切换到输入模式。

命令模式只有一些最基本的命令,因此仍要依靠底线命令模式输入更多命令。

输入模式

在命令模式下按下i就进入了输入模式。

在输入模式中,可以使用以下按键:

  • 字符按键以及Shift组合,输入字符
  • ENTER,回车键,换行
  • BACK SPACE,退格键,删除光标前一个字符
  • DEL,删除键,删除光标后一个字符
  • 方向键,在文本中移动光标
  • HOME/END,移动光标到行首/行尾
  • Page Up/Page Down,上/下翻页
  • Insert,切换光标为输入/替换模式,光标将变成竖线/下划线
  • ESC,退出输入模式,切换到命令模式

底线命令模式

在命令模式下按下:(英文冒号)就进入了底线命令模式。

底线命令模式可以输入单个或多个字符的命令,可用的命令非常多。

在底线命令模式中,基本的命令有(已经省略了冒号):

  • q 退出程序
  • w 保存文件

按ESC键可随时退出底线命令模式。

简单的说,我们可以将这三个模式想成底下的图标来表示:

image

vi/vim 使用实例

使用 vi/vim 进入一般模式

如果你想要使用 vi 来建立一个名为 runoob.txt 的文件时,你可以这样做:

$ vim runoob.txt

直接输入 vi 文件名 就能够进入 vi 的一般模式了。请注意,记得 vi 后面一定要加文件名,不管该文件存在与否!

img

按下 i 进入输入模式(也称为编辑模式),开始编辑文字

在一般模式之中,只要按下 i, o, a 等字符就可以进入输入模式了!

在编辑模式当中,你可以发现在左下角状态栏中会出现 –INSERT- 的字样,那就是可以输入任意字符的提示。

这个时候,键盘上除了 Esc 这个按键之外,其他的按键都可以视作为一般的输入按钮了,所以你可以进行任何的编辑。

img

按下 ESC 按钮回到一般模式

好了,假设我已经按照上面的样式给他编辑完毕了,那么应该要如何退出呢?是的!没错!就是给他按下 Esc 这个按钮即可!马上你就会发现画面左下角的 – INSERT – 不见了!

在一般模式中按下储存后离开

OK,我们要存档了,存盘并离开的指令很简单,输入 :wq 即可保存离开!

img

OK! 这样我们就成功创建了一个 runoob.txt 的文件。


vi/vim 按键说明

除了上面简易范例的 i, Esc, :wq 之外,其实 vim 还有非常多的按键可以使用。

第一部分:一般模式可用的光标移动、复制粘贴、搜索替换等

移动光标的方法
h 或 向左箭头键(←) 光标向左移动一个字符
j 或 向下箭头键(↓) 光标向下移动一个字符
k 或 向上箭头键(↑) 光标向上移动一个字符
l 或 向右箭头键(→) 光标向右移动一个字符
如果你将右手放在键盘上的话,你会发现 hjkl 是排列在一起的,因此可以使用这四个按钮来移动光标。 如果想要进行多次移动的话,例如向下移动 30 行,可以使用 "30j" 或 "30↓" 的组合按键, 亦即加上想要进行的次数(数字)后,按下动作即可!
[Ctrl] + [f] 屏幕『向下』移动一页,相当于 [Page Down]按键 (常用)
[Ctrl] + [b] 屏幕『向上』移动一页,相当于 [Page Up] 按键 (常用)
[Ctrl] + [d] 屏幕『向下』移动半页
[Ctrl] + [u] 屏幕『向上』移动半页
+ 光标移动到非空格符的下一行
- 光标移动到非空格符的上一行
n 那个 n 表示『数字』,例如 20 。按下数字后再按空格键,光标会向右移动这一行的 n 个字符。例如 20 则光标会向后面移动 20 个字符距离。
0 或功能键[Home] 这是数字『 0 』:移动到这一行的最前面字符处 (常用)
$ 或功能键[End] 移动到这一行的最后面字符处(常用)
H 光标移动到这个屏幕的最上方那一行的第一个字符
M 光标移动到这个屏幕的中央那一行的第一个字符
L 光标移动到这个屏幕的最下方那一行的第一个字符
G 移动到这个档案的最后一行(常用)
nG n 为数字。移动到这个档案的第 n 行。例如 20G 则会移动到这个档案的第 20 行(可配合 :set nu)
gg 移动到这个档案的第一行,相当于 1G 啊! (常用)
n n 为数字。光标向下移动 n 行(常用)
搜索替换
/word 向光标之下寻找一个名称为 word 的字符串。例如要在档案内搜寻 vbird 这个字符串,就输入 /vbird 即可! (常用)
?word 向光标之上寻找一个字符串名称为 word 的字符串。
n 这个 n 是英文按键。代表重复前一个搜寻的动作。举例来说, 如果刚刚我们执行 /vbird 去向下搜寻 vbird 这个字符串,则按下 n 后,会向下继续搜寻下一个名称为 vbird 的字符串。如果是执行 ?vbird 的话,那么按下 n 则会向上继续搜寻名称为 vbird 的字符串!
N 这个 N 是英文按键。与 n 刚好相反,为『反向』进行前一个搜寻动作。 例如 /vbird 后,按下 N 则表示『向上』搜寻 vbird 。
使用 /word 配合 n 及 N 是非常有帮助的!可以让你重复的找到一些你搜寻的关键词!
:n1,n2s/word1/word2/g n1 与 n2 为数字。在第 n1 与 n2 行之间寻找 word1 这个字符串,并将该字符串取代为 word2 !举例来说,在 100 到 200 行之间搜寻 vbird 并取代为 VBIRD 则: 『:100,200s/vbird/VBIRD/g』。(常用)
:1,$s/word1/word2/g:%s/word1/word2/g 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !(常用)
:1,$s/word1/word2/gc:%s/word1/word2/gc 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !且在取代前显示提示字符给用户确认 (confirm) 是否需要取代!(常用)
删除、复制与贴上
x, X 在一行字当中,x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是退格键) (常用)
nx n 为数字,连续向后删除 n 个字符。举例来说,我要连续删除 10 个字符, 『10x』。
dd 删除游标所在的那一整行(常用)
ndd n 为数字。删除光标所在的向下 n 行,例如 20dd 则是删除 20 行 (常用)
d1G 删除光标所在到第一行的所有数据
dG 删除光标所在到最后一行的所有数据
d$ 删除游标所在处,到该行的最后一个字符
d0 那个是数字的 0 ,删除游标所在处,到该行的最前面一个字符
yy 复制游标所在的那一行(常用)
nyy n 为数字。复制光标所在的向下 n 行,例如 20yy 则是复制 20 行(常用)
y1G 复制游标所在行到第一行的所有数据
yG 复制游标所在行到最后一行的所有数据
y0 复制光标所在的那个字符到该行行首的所有数据
y$ 复制光标所在的那个字符到该行行尾的所有数据
p, P p 为将已复制的数据在光标下一行贴上,P 则为贴在游标上一行! 举例来说,我目前光标在第 20 行,且已经复制了 10 行数据。则按下 p 后, 那 10 行数据会贴在原本的 20 行之后,亦即由 21 行开始贴。但如果是按下 P 呢? 那么原本的第 20 行会被推到变成 30 行。 (常用)
J 将光标所在行与下一行的数据结合成同一行
c 重复删除多个数据,例如向下删除 10 行,[ 10cj ]
u 复原前一个动作。(常用)
[Ctrl]+r 重做上一个动作。(常用)
这个 u 与 [Ctrl]+r 是很常用的指令!一个是复原,另一个则是重做一次~ 利用这两个功能按键,你的编辑,嘿嘿!很快乐的啦!
. 不要怀疑!这就是小数点!意思是重复前一个动作的意思。 如果你想要重复删除、重复贴上等等动作,按下小数点『.』就好了! (常用)

第二部分:一般模式切换到编辑模式的可用的按钮说明

进入输入或取代的编辑模式
i, I 进入输入模式(Insert mode): i 为『从目前光标所在处输入』, I 为『在目前所在行的第一个非空格符处开始输入』。 (常用)
a, A 进入输入模式(Insert mode): a 为『从目前光标所在的下一个字符处开始输入』, A 为『从光标所在行的最后一个字符处开始输入』。(常用)
o, O 进入输入模式(Insert mode): 这是英文字母 o 的大小写。o 为在目前光标所在的下一行处输入新的一行; O 为在目前光标所在的上一行处输入新的一行!(常用)
r, R 进入取代模式(Replace mode): r 只会取代光标所在的那一个字符一次;R会一直取代光标所在的文字,直到按下 ESC 为止;(常用)
上面这些按键中,在 vi 画面的左下角处会出现『--INSERT--』或『--REPLACE--』的字样。 由名称就知道该动作了吧!!特别注意的是,我们上面也提过了,你想要在档案里面输入字符时, 一定要在左下角处看到 INSERT 或 REPLACE 才能输入喔!
[Esc] 退出编辑模式,回到一般模式中(常用)

第三部分:一般模式切换到指令行模式的可用的按钮说明

指令行的储存、离开等指令
:w 将编辑的数据写入硬盘档案中(常用)
:w! 若文件属性为『只读』时,强制写入该档案。不过,到底能不能写入, 还是跟你对该档案的档案权限有关啊!
:q 离开 vi (常用)
:q! 若曾修改过档案,又不想储存,使用 ! 为强制离开不储存档案。
注意一下啊,那个惊叹号 (!) 在 vi 当中,常常具有『强制』的意思~
:wq 储存后离开,若为 :wq! 则为强制储存后离开 (常用)
ZZ 这是大写的 Z 喔!如果修改过,保存当前文件,然后退出!效果等同于(保存并退出)
ZQ 不保存,强制退出。效果等同于 :q!
:w [filename] 将编辑的数据储存成另一个档案(类似另存新档)
:r [filename] 在编辑的数据中,读入另一个档案的数据。亦即将 『filename』 这个档案内容加到游标所在行后面
:n1,n2 w [filename] 将 n1 到 n2 的内容储存成 filename 这个档案。
:! command 暂时离开 vi 到指令行模式下执行 command 的显示结果!例如 『:! ls /home』即可在 vi 当中察看 /home 底下以 ls 输出的档案信息!
vim 环境的变更
:set nu 显示行号,设定之后,会在每一行的前缀显示该行的行号
:set nonu 与 set nu 相反,为取消行号!

特别注意,在 vi/vim 中,数字是很有意义的!数字通常代表重复做几次的意思! 也有可能是代表去到第几个什么什么的意思。

举例来说,要删除 50 行,则是用 『50dd』 对吧! 数字加在动作之前,如我要向下移动 20 行呢?那就是『20j』或者是『20↓』即可。

vim 批量添加注释

方法一 :块选择模式

批量注释:

Ctrl + v 进入块选择模式,然后移动光标选中你要注释的行,再按大写的 I 进入行首插入模式输入注释符号如 //#,输入完毕之后,按两下 ESCVim 会自动将你选中的所有行首都加上注释,保存退出完成注释。

取消注释:

Ctrl + v 进入块选择模式,选中你要删除的行首的注释符号,注意 // 要选中两个,选好之后按 d 即可删除注释,ESC 保存退出。

方法二: 替换命令

批量注释。

使用下面命令在指定的行首添加注释。

使用名命令格式: :起始行号,结束行号s/^/注释符/g(注意冒号)。

取消注释:

使用名命令格式: :起始行号,结束行号s/^注释符//g(注意冒号)。

例子:

1、在 10 - 20 行添加 // 注释

:10,20s#^#//#g

2、在 10 - 20 行删除 // 注释

:10,20s#^//##g

3、在 10 - 20 行添加 # 注释

:10,20s/^/#/g

4、在 10 - 20 行删除 # 注释

:10,20s/#//g

vim 快捷键补充(插入模式)

  1. 自动补全:ctrl + n
  2. \p< 插入一个include,并把光标置于<>中间
  3. \im 插入主函数
  4. \ip 插入printf,并自动添加\n,且把光标置于双引号中间

vim快捷键补充(编辑模式)

  1. dw 删除一个单词(配合b:将光标置于所在单词的首部)
  2. yw 复制一个单词(配合p:粘贴)

vim快捷键补充(插入与编辑模式通用)

  1. \rr 运行程序
  2. \rc 保存并编译程序(会生成二进制文件)
posted @ 2021-09-04 18:44  #July  阅读(380)  评论(0)    收藏  举报