1. 程式人生 > 其它 >Linux 命令學習

Linux 命令學習

本文主要內容來自網路學習整理,東西太多太亂本身就就是作為筆記整理,故沒有引用。

ToDo:

1. 熟練使用、理解這幾個命令的用法和輸出:

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

  • 定義作用域,大致分類

  • [x] 檢視各種資訊 vmstat iostate netstat top

  • [x] 網路通訊 ping

  • [x] 檔案管理 rm ln find

  • [x] 三劍客 grep sed awk 文字處理,後兩者還能檔案管理

  • [x] 程式碼編輯器 vi / vim

學習總結

學習指令的步驟:首先善用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),硬連結的意思是一個檔案可以有多個名稱,而軟連結的方式則是產生一個特殊的檔案,該檔案的內容是指向另一個檔案的位置。硬連結是存在同一個檔案系統中,而軟連結卻可以跨越不同的檔案系統。 不論是硬連結或軟連結都不會將原本的檔案複製一份,只會佔用非常少量的磁碟空間。

軟連結

    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系統中,支援兩種正則表示式,分別為“標準正則表示式”和“擴充套件正則表示式”。

  • [x] 除去下列的學習和總結外,還參考學習了《老男孩運維三劍客》復現書中的案例,鑑於內容過多,不在此處重複贅述

一、正則表示式

正則表示式: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.模式空間與保持空間

在模式空間中,完成匹配的操作。當沒有匹配上的時候,文字行內容會預設輸出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 鍵盤圖:

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鍵可隨時退出底線命令模式。

簡單的說,我們可以將這三個模式想成底下的圖示來表示:

vi/vim 使用例項

使用 vi/vim 進入一般模式

如果你想要使用 vi 來建立一個名為 runoob.txt 的檔案時,你可以這樣做:

$ vim runoob.txt

直接輸入 vi 檔名 就能夠進入 vi 的一般模式了。請注意,記得 vi 後面一定要加檔名,不管該檔案存在與否!

按下 i 進入輸入模式(也稱為編輯模式),開始編輯文字

在一般模式之中,只要按下 i, o, a 等字元就可以進入輸入模式了!

在編輯模式當中,你可以發現在左下角狀態列中會出現 –INSERT- 的字樣,那就是可以輸入任意字元的提示。

這個時候,鍵盤上除了 Esc 這個按鍵之外,其他的按鍵都可以視作為一般的輸入按鈕了,所以你可以進行任何的編輯。

按下 ESC 按鈕回到一般模式

好了,假設我已經按照上面的樣式給他編輯完畢了,那麼應該要如何退出呢?是的!沒錯!就是給他按下 Esc 這個按鈕即可!馬上你就會發現畫面左下角的 – INSERT – 不見了!

在一般模式中按下儲存後離開

OK,我們要存檔了,存檔並離開的指令很簡單,輸入 :wq 即可儲存離開!

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 儲存並編譯程式(會生成二進位制檔案)
就這樣吧