Linux快速入手系列二( 文本處理 )

更多精彩文章點擊 -> 我的學習小站 & 更多好玩點擊 -> 技術雜談

文本編輯神器-Vim

vim的三種操作模式

vim有三種操作模式,分別是命令模式(Command mode)、輸入模式(Insert mode)和底線命令模式(Last line mode)。

三種模式切換快捷鍵:

模式 快捷鍵
命令模式 ESC
輸入模式 i 或 a
底線命令模式 :
  • 命令模式

    在命令模式中控制光標移動和輸入命令,可對文本進行復制、粘貼、刪除和查找等工作。

    使用命令vim filename後進入編輯器視圖後,默認模式就是命令模式,此時敲擊鍵盤字母會被識別爲一個命令,例如在鍵盤上連續敲擊兩次d,就會刪除光標所在行。

    以下是在命令模式中常用的快捷操作:

操作 快捷鍵
光標左移 h
光標右移 l(小寫L)
光標上移 k
光標下移 j
光標移動到下一個單詞 w
光標移動到上一個單詞 b
移動遊標到第n行 nG
移動遊標到第一行 gg
移動遊標到最後一行 G
快速回到上一次光標所在位置 Ctrl+o
刪除當前字符 x
刪除前一個字符 X
刪除整行 dd
刪除一個單詞 dw或daw
刪除至行尾 d$或D
刪除至行首 d^
刪除到文檔末尾 dG
刪除至文檔首部 d1G
刪除n行 ndd
刪除n個連續字符 nx
將光標所在位置字母變成大寫或小寫 ~
複製遊標所在的整行 yy(3yy表示複製3行)
粘貼至光標後(下) p
粘貼至光標前(上) P
剪切 dd
交換上下行 ddp
替換整行,即刪除遊標所在行並進入插入模式 cc
撤銷一次或n次操作 u{n}
撤銷當前行的所有修改 U
恢復撤銷操作 Ctrl+r
整行將向右縮進 >>
整行將向左退回 <<
若檔案沒有更動,則不儲存離開,若檔案已經被更動過,則儲存後離開 ZZ
  • 輸入模式

    在命令模式下按i或a鍵就進入了輸入模式,在輸入模式下,您可以正常的使用鍵盤按鍵對文本進行插入和刪除等操作。

  • 底線命令模式

    在命令模式下按:鍵就進入了底線命令模式,在底線命令模式中可以輸入單個或多個字符的命令。

    以下是底線命令模式中常用的快捷操作:

操作 命令
保存 :w
退出 :q
保存並退出 :wq(:wq!表示強制保存退出)
將文件另存爲其他文件名 :w new_filename
顯示行號 :set nu
取消行號 :set nonu
使本行內容居中 :ce
使本行文本靠右 :ri
使本行內容靠左 :le
向光標之下尋找一個名稱爲word的字符串 :/word
向光標之上尋找一個字符串名稱爲word的字符串 :?word
重複前一個搜尋的動作 :n
從第一行到最後一行尋找word1字符串,並將該字符串取代爲word2 :1,$s/word1/word2/g:%s/word1/word2/g

使用示例

在本示例將使用vim在文本文件中寫入一首唐詩。

  • 新建一個文件並進入vim命令模式。

    vim 靜夜思.txt
    
  • 按下i進入輸入模式,輸入 靜夜思

  • 按下ECS鍵回到命令模式,並輸入底線命令:ce,使詩名居中。

  • 按下o鍵 換行同時進入輸入模式,輸入第一行詩。

                                         靜夜思
                                窗前明月光,疑是地上霜.
    
  • 按下ECS鍵回到命令模式,並輸入底線命令:ce,使第一行詩居中。

  • 按下o鍵換行並進入輸入模式,輸入第二行詩。

  • 按下ECS鍵回到命令模式,並輸入底線命令:ce,使第二行詩居中。

  • 在命令模式中執行底線命令:wq離開vim。

文本文件查看命令

cat(常用)

命令描述:cat命令用於查看內容較少的純文本文件。

命令格式:cat [選項] [文件]

命令參數說明:

參數 說明
-n或–number 顯示行號
-b或–number-nonblank 顯示行號,但是不對空白行進行編號
-s或–squeeze-blank 當遇到有連續兩行以上的空白行,只顯示一行的空白行

命令使用示例:

  • 將一個自增序列寫入test.txt文件中。

    for i in $(seq 1 10); do echo $i >> test.txt ; done
    
  • 查看文件內容。

    [root@sb6a ~]# cat test.txt
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
  • 將文件內容清空。

    cat /dev/null > test.txt
    
  • 再次檢查文件內容,結果內容爲空。

more(常用)

命令描述:more命令從前向後分頁顯示文件內容。

常用操作命令:

操作 作用
Enter 向下n行,n需要定義,默認爲1行
Ctrl+F或空格鍵(Space) 向下滾動一頁
Ctrl+B 向上滾動一頁
= 輸出當前行的行號
!命令 調用Shell執行命令
q 退出more

命令使用示例:

  • 從第20行開始分頁查看系統日誌文件/var/log/messages。

    [root@sb6a ~]# more +20 /var/log/messages
    Apr 26 16:02:02 sb6a systemd: Stopped target Login Prompts.
    Apr 26 16:02:02 sb6a systemd: Stopping Serial Getty on ttyS0...
    Apr 26 16:02:02 sb6a systemd: Stopping Getty on tty1...
    Apr 26 16:02:02 sb6a systemd: Stopped Execute cloud user/final scripts.
    Apr 26 16:02:02 sb6a systemd: Stopped Apply the settings specified in cloud-config.
    Apr 26 16:02:02 sb6a systemd: Stopped target Cloud-config availability.
    Apr 26 16:02:02 sb6a systemd: Stopping Command Scheduler...
    Apr 26 16:02:02 sb6a systemd: Stopping Session 3 of user root.
    Apr 26 16:02:02 sb6a systemd: Stopping Session 2 of user root.
    Apr 26 16:02:02 sb6a systemd: Stopped Daily Cleanup of Temporary Directories.
    Apr 26 16:02:02 sb6a systemd: Stopping Job spooling tools...
    Apr 26 16:02:02 sb6a systemd: Stopped Authorization Manager.
    Apr 26 16:02:02 sb6a systemd: Stopped NTP client/server.
    Apr 26 16:02:02 sb6a systemd: Stopped aliyun-assist.
    Apr 26 16:02:02 sb6a systemd: Stopped OpenSSH server daemon.
    Apr 26 16:02:02 sb6a systemd: Stopped Job spooling tools.
    Apr 26 16:02:02 sb6a systemd: Stopped Command Scheduler.
    Apr 26 16:02:02 sb6a systemd: Stopped Serial Getty on ttyS0.
    Apr 26 16:02:02 sb6a systemd: Stopped Getty on tty1.
    Apr 26 16:02:02 sb6a systemd: Stopped Session 2 of user root.
    Apr 26 16:02:02 sb6a systemd: Stopped System Logging Service.
    Apr 26 16:02:02 sb6a systemd: Stopped Session 3 of user root.
    Apr 26 16:02:02 sb6a systemd: Removed slice User Slice of root.
    Apr 26 16:02:02 sb6a systemd: Stopping Login Service...
    Apr 26 16:02:02 sb6a systemd: Starting Show Plymouth Power Off Screen...
    Apr 26 16:02:02 sb6a systemd: Removed slice system-getty.slice.
    Apr 26 16:02:02 sb6a systemd: Removed slice system-serial\x2dgetty.slice.
    Apr 26 16:02:02 sb6a systemd: Stopping Permit User Sessions...
    Apr 26 16:02:02 sb6a systemd: Stopped Permit User Sessions.
    --More--(4%)
    

less(常用)

命令描述:less命令可以對文件或其它輸出進行分頁顯示,與moe命令相似,但使用 less 可以隨意瀏覽文件,而 more 僅能向前移動,卻不能向後移動。

命令格式:less [參數] 文件

命令參數說明:

參數 說明
-e 當文件顯示結束後,自動離開
-m 顯示類似more命令的百分比
-N 顯示每行的行號
-s 顯示連續空行爲一行

命令常用操作:

快捷鍵 說明
/字符串 向下搜索字符串
?字符串 向上搜索字符串
n 重複前一個搜索
N 反向重複前一個搜索
b或pageup 向上翻一頁
空格鍵或pagedown 向下翻一頁
u 向前翻半頁
d 向後翻半頁
y 向前滾動一行
回車鍵 向後滾動一行
q 退出less命令

命令使用示例:

查看命令歷史使用記錄並通過less分頁顯示。

history | less

head(常用)

命令描述:head命令用於查看文件開頭指定行數的內容。

命令格式:head [參數] [文件]

命令參數說明:

參數 說明
-n [行數] 顯示開頭指定行的文件內容,默認爲10
-c [字符數] 顯示開頭指定個數的字符數
-q 不顯示文件名字信息,適用於多個文件,多文件時默認會顯示文件名

命令使用示例:

查看/etc/passwd文件的前5行內容。

head -5 /etc/passwd

tail(常用)

命令描述:tail命令用於查看文檔的後N行或持續刷新內容。

命令格式:tail [參數] [文件]

命令參數說明:

參數 說明
-f 顯示文件最新追加的內容
-q 當有多個文件參數時,不輸出各個文件名
-v 當有多個文件參數時,總是輸出各個文件名
-c [字節數] 顯示文件的尾部n個字節內容
-n [行數] 顯示文件的尾部n行內容

命令使用示例:

查看/var/log/messages系統日誌文件的最新10行,並保持實時刷新。

tail -f -n 10 /var/log/messages

ctrl+c鍵退出文本實時查看界面。

stat

命令描述:用來顯示文件的詳細信息,包括inode、atime、mtime、ctime等。

命令使用示例:

查看/etc/passwd文件的詳細信息。

[root@sb6a ~]# stat /etc/passwd
  File: ‘/etc/passwd’
  Size: 1000            Blocks: 8          IO Block: 4096   regular file
Device: fd01h/64769d    Inode: 1059598     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2020-06-04 20:50:08.717697646 +0800
Modify: 2020-06-04 20:50:08.703697160 +0800
Change: 2020-06-04 20:50:08.704697195 +0800
 Birth: -

wc

命令描述:wc命令用於統計指定文本的行數、字數、字節數。

命令格式:wc [參數] [文件]

命令參數說明:

參數 說明
-l 只顯示行數
-w 只顯示單詞數
-c 只顯示字節數

命令使用示例:

統計/etc/passwd文件的行數。

[root@sb6a ~]# wc -l /etc/passwd
23 /etc/passwd

file

命令描述: file命令用於辨識文件類型。

命令格式:file [參數] [文件]

命令參數說明:

參數 說明
-b 列出辨識結果時,不顯示文件名稱
-c 詳細顯示指令執行過程,便於排錯或分析程序執行的情形
-f [文件] 指定名稱文件,其內容有一個或多個文件名稱時,讓file依序辨識這些文件,格式爲每列一個文件名稱
-L 直接顯示符號連接所指向的文件類別

命令使用示例:

查看/var/log/messages文件的文件類型。

[root@sb6a ~]# file /var/log/messages
/var/log/messages: UTF-8 Unicode text

diff(常用)

命令描述:diff命令用於比較文件的差異。

命令使用示例:

  • 構造兩個相似的文件

    echo -e '第一行\n第二行\n我是log1第3行\n第四行\n第五行\n第六行' > 1.log
    echo -e '第一行\n第二行\n我是log2第3行\n第四行' > 2.log
    
  • 分別查看兩個文件

    [root@sb6a ~]# echo -e '第一行\n第二行\n我是log1第3行\n第四行\n第五行\n第六行' > 1.log
    [root@sb6a ~]# echo -e '第一行\n第二行\n我是log2第3行\n第四行' > 2.log
    [root@sb6a ~]# cat 1.log
    第一行
    第二行
    我是log1第3行
    第四行
    第五行
    第六行
    [root@sb6a ~]# cat 2.log
    第一行
    第二行
    我是log2第3行
    第四行
    
  • 使用diff查看兩個文件的差異

    [root@sb6a ~]# diff 1.log 2.log
    3c3
    < 我是log1第3行
    ---
    > 我是log2第3行
    5,6d4
    < 第五行
    < 第六行
    

    對比結果中的 3c3 表示兩個文件在第3行有不同,5,6d4 表示 2.log 文件相比 1.log 文件在第 4 行處開始少了 1.log 文件的第5和第6行。

文本文件處理命令

grep(常用)

命令描述:grep命令用於查找文件裏符合條件的字符串。

grep全稱是Global Regular Expression Print,表示全局正則表達式版本,它能使用正則表達式搜索文本,並把匹配的行打印出來。

在Shell腳本中,grep通過返回一個狀態值來表示搜索的狀態:

  • 0:匹配成功。
  • 1:匹配失敗。
  • 2:搜索的文件不存在。

命令格式:grep [參數] [正則表達式] [文件]

命令常用參數說明:

參數 說明
-c或–count 計算符合樣式的列數
-d recurse或-r 指定要查找的是目錄而非文件
-e [範本樣式] 指定字符串做爲查找文件內容的樣式
-E 或 --extended-regexp 將樣式爲延伸的正則表達式來使用
-F 或 --fixed-regexp 將樣式視爲固定字符串的列表
-G 或 --basic-regexp 將樣式視爲普通的表示法來使用
-i 或 --ignore-case 忽略字符大小寫的差別
-n 或 --line-number 在顯示符合樣式的那一行之前,標示出該行的列數編號
-v 或 --revert-match 顯示不包含匹配文本的所有行

命令使用示例:

  • 查看sshd服務配置文件中監聽端口配置所在行編號。

    [root@sb6a ~]# grep -n Port /etc/ssh/ssh_config
    41:#   Port 22
    
  • 查詢字符串在文本中出現的行數。

    [root@sb6a ~]# grep -c localhost /etc/hosts
    2
    
    
  • 反向查找,不顯示符合條件的行。

    [root@sb6a ~]# ps -ef | grep sshd
    root       985     1  0 20:45 ?        00:00:00 /usr/sbin/sshd -D
    root      1390   985  0 20:46 ?        00:00:00 sshd: root@pts/0
    root      1538   985  0 21:04 ?        00:00:00 sshd: root@pts/1
    root     11263  1541  0 21:27 pts/1    00:00:00 grep --color=auto sshd
    
    [root@sb6a ~]# ps -ef | grep -v grep | grep sshd
    root       985     1  0 20:45 ?        00:00:00 /usr/sbin/sshd -D
    root      1390   985  0 20:46 ?        00:00:00 sshd: root@pts/0
    root      1538   985  0 21:04 ?        00:00:00 sshd: root@pts/1
    
    
  • 以遞歸的方式查找目錄下含有關鍵字的文件。

    [root@sb6a ~]# grep -r *.sh /etc
    Binary file /etc/udev/hwdb.bin matches
    /etc/NetworkManager/dispatcher.d/11-dhclient:    for f in $ETCDIR/dhclient.d/*.sh; do
    /etc/bashrc:    for i in /etc/profile.d/*.sh; do
    /etc/profile:for i in /etc/profile.d/*.sh /etc/profile.d/sh.local ; do
    
    
  • 使用正則表達式匹配httpd配置文件中異常狀態碼響應的相關配置。

    [root@sb6a ~]# grep 'ntp[0-9].aliyun.com' /etc/ntp.conf
    restrict ntp1.aliyun.com nomodify notrap nopeer noquery
    restrict ntp2.aliyun.com nomodify notrap nopeer noquery
    restrict ntp3.aliyun.com nomodify notrap nopeer noquery
    restrict ntp4.aliyun.com nomodify notrap nopeer noquery
    restrict ntp5.aliyun.com nomodify notrap nopeer noquery
    restrict ntp6.aliyun.com nomodify notrap nopeer noquery
    server ntp1.aliyun.com iburst minpoll 4 maxpoll 10
    server ntp2.aliyun.com iburst minpoll 4 maxpoll 10
    server ntp3.aliyun.com iburst minpoll 4 maxpoll 10
    server ntp4.aliyun.com iburst minpoll 4 maxpoll 10
    server ntp5.aliyun.com iburst minpoll 4 maxpoll 10
    server ntp6.aliyun.com iburst minpoll 4 maxpoll 10
    
    

sed(常用)

命令描述:sed是一種流編輯器,它是文本處理中非常中的工具,能夠完美的配合正則表達式使用。

  1. 處理時,把當前處理的行存儲在臨時緩衝區中,稱爲模式空間(pattern space)。

  2. 接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。

  3. 接着處理下一行,這樣不斷重複,直到文件末尾。

注意:

  • sed命令不會修改原文件,例如刪除命令只表示某些行不打印輸出,而不是從原文件中刪去。
  • 如果要改變源文件,需要使用-i選項。

命令格式:sed [參數] [動作] [文件]

參數說明:

參數 說明
-e [script] 執行多個script
-f [script文件] 執行指定script文件
-n 僅顯示script處理後的結果
-i 輸出到原文件,靜默執行(修改原文件)

動作說明:

動作 說明
a 在行後面增加內容
c 替換行
d 刪除行
i 在行前面插入
p 打印相關的行
s 替換內容

命令使用示例:

  • 刪除第3行到最後一行內容。

    [root@sb6a ~]# sed '3,$d' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    
    
  • 在最後一行新增行。

    [root@sb6a ~]# sed '$a admin:x:1000:1000:admin:/home/admin:/bin/bash' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    polkitd:x:999:998:User for polkitd:/:/sbin/nologin
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    chrony:x:998:996::/var/lib/chrony:/sbin/nologin
    nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
    tcpdump:x:72:72::/:/sbin/nologin
    test:x:1000:1000::/home/test:/bin/bash
    admin:x:1001:1001::/home/admin:/bin/bash
    admin:x:1000:1000:admin:/home/admin:/bin/bash
    
    
  • 替換內容。

    [root@sb6a ~]# sed 's/SELINUX=disabled/SELINUX=enforcing/' /etc/selinux/config
    
    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    #     enforcing - SELinux security policy is enforced.
    #     permissive - SELinux prints warnings instead of enforcing.
    #     disabled - No SELinux policy is loaded.
    SELINUX=enforcing
    # SELINUXTYPE= can take one of three values:
    #     targeted - Targeted processes are protected,
    #     minimum - Modification of targeted policy. Only selected processes are protected.
    #     mls - Multi Level Security protection.
    SELINUXTYPE=targeted
    
    
  • 替換行。

    [root@sb6a ~]# sed '1c abcdefg' /etc/passwd
    abcdefg
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    polkitd:x:999:998:User for polkitd:/:/sbin/nologin
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    chrony:x:998:996::/var/lib/chrony:/sbin/nologin
    nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
    tcpdump:x:72:72::/:/sbin/nologin
    test:x:1000:1000::/home/test:/bin/bash
    admin:x:1001:1001::/home/admin:/bin/bash
    
    

awk(常用)

命令描述:和 sed 命令類似,awk 命令也是逐行掃描文件(從第 1 行到最後一行),尋找含有目標文本的行,如果匹配成功,則會在該行上執行用戶想要的操作;反之,則不對行做任何處理。

命令格式:awk [參數] [腳本] [文件]

參數說明:

參數 說明
-F fs 指定以fs作爲輸入行的分隔符,awk 命令默認分隔符爲空格或製表符
-f file 讀取awk腳本
-v val=val 在執行處理過程之前,設置一個變量var,並給其設置初始值爲val

內置變量:

變量 用途
FS 字段分隔符
$n 指定分隔的第n個字段,如$1、$3分別表示第1、第三列
$0 當前讀入的整行文本內容
NF 記錄當前處理行的字段個數(列數)
NR 記錄當前已讀入的行數
FNR 當前行在源文件中的行號

awk中還可以指定腳本命令的運行時機。默認情況下,awk會從輸入中讀取一行文本,然後針對該行的數據執行程序腳本,但有時可能需要在處理數據前運行一些腳本命令,這就需要使用BEGIN關鍵字,BEGIN會在awsk讀取數據前強制執行該關鍵字後指定的腳本命令。

和BEGIN關鍵字相對應,END關鍵字允許我們指定一些腳本命令,awk會在讀完數據後執行它們。

命令使用示例:

  • 查看本機IP地址。

    [root@sb6a ~]# ifconfig eth0 |awk '/inet/{print $2}'
    172.16.1.203
    
    
  • 查看本機剩餘磁盤容量。

    [root@sb6a ~]# df -h | awk '/\/$/{print $4}'
    36G
    
    
  • 關閉指定服務的所有的進程。

    ps -ef | grep httpd | awk {'print $2'} | xargs kill -9
    
    

Reference

阿里雲開發者社區

更多

Linux快速入手系列一(文件管理)

Linux快速入手系列二( 文本處理 )

Linux快速入手系列三( 系統管理 )

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章