1. 程式人生 > >文本處理(grep,vim),正則表達式

文本處理(grep,vim),正則表達式

監控 但是 作用 影響 能夠 行為 format 兩個文件 onf

文件查看:
  • cat [OPTION]... [FILE]...
    -E:顯示行結束符$
    -n:對顯示出的每一行進行編號
    -A:顯示所有控制符
    -b:非空行編號
    -s:壓縮連續的空行成一行

  • tac :內容倒過來顯示

  • rev :每行倒過來顯示

  • more:分頁查看文件
    more [OPTIONS...] FILE...
    -d: 顯示翻頁及退出提示
    例:ls -R /etc/ | more ,它翻到最後就退出了

  • less:一頁一頁地查看文件或STDIN輸出
    查看時有用的命令包括:
    /文本 :搜索 文本
    n/N :跳到下一個 或 上一個匹配
    less命令是man命令使用的分頁器
    例:ls -R /etc/ | more ,它可以上下翻頁,用q退出

  • head [OPTION]... [FILE]...
    -c # 指定獲取前#字節
    -n # 指定獲取前#行
    -# 指定行數
    例:cat -n /etc/passwd | head -n 5

  • tail [OPTION]... [FILE]...
    -c # 指定獲取後#字節
    -n # 指定獲取後#行
    -# 同上
    -f 跟蹤顯示文件fd新追加的內容,常用日誌監控
    相當於 --follow=descriptor
  • 註意:如果文件被刪除掉,如果再創建同名的文件(fd基本上不會相同),修改新的文件內容對它是沒有影響的,因為它跟蹤的是fd
    -F 跟蹤文件名,相當於--follow=name --retry
  • 註意:如果文件被刪除掉,如果再創建同名的文件,修改新的文件內容它也會繼續顯示,因為雖然不是同一個文件但文件名字一樣

  • tailf 類似tail –f,當文件不增長時並不訪問文件

  • 想要取中間的行可以先head再tail

按列抽取文本

  • cut [OPTION]... [FILE]...
    -d DELIMITER: 指明分隔符,默認tab
    -f FILEDS:
    #: 第#個字段
    #,#[,#]:離散的多個字段,例如1,3,6
    #-#:連續的多個字段, 例如1-6
    混合使用:1-3,7
    -c 按字符切割
    --output-delimiter=STRING指定輸出分隔符

例子:

14:34[root@centos7 /data]# df |tr -s " " |cut -d" " -f5|tr -d "%"
4:35[root@centos7 /data]# df|tr -s " " "%"|cut -d% -f5
上面兩個結果都是:
Use
4
0
0
2
0
1
18
1
100

14:35[root@centos7 /data]# ifconfig|head -2|tail -1|tr -s " "|cut -d" " -f3
192.168.36.102

paste 合並兩個文件同行號的列到一行

  • paste [OPTION]... [FILE]...
    -d 分隔符:指定分隔符,默認用TAB
    -s : 所有行合成一行顯示: 每個文件所有列變成一行,然後再將每個文件的內容一行一行的顯示出來(按照前後順序)
    示例:
    paste f1 f2
    paste -s f1 f2

收集文本統計數據wc

計數單詞總數、行總數、字節總數和字符總數
可以對文件或STDIN中的數據運行
wc story.txt
39 237 1901 story.txt
行數 字(單詞)數 字節數(大小)
常用選項
-l 只計數行數:查看多少用戶wc -l /etc/passwd ,查看多少用戶登陸who|wc -l
-w 只計數單詞總數
-c 只計數字節總數
-m 只計數字符總數
-L 顯示文件中最長行的長度

文本排序sort

把整理過的文本顯示在STDOUT,不改變原始文件
註:sort本身也是標準輸入,不加選項會讓你鍵盤輸入字符,然後ctrl+d就開始排序.
sort [options] file(s)
常用選項
-r 執行反方向(由上至下)整理
-R 隨機排序
-n 執行按數字大小整理
-f 選項忽略(fold)字符串中的字符大小寫
-u 選項(獨特,unique)刪除輸出中的重復行
-t c 選項使用c做為字段界定符
-k X 選項按照使用c字符分隔的X列來整理,能夠使用多次
例子:
sort -n -t: -k3 /etc/passwd
df | tr -s " " "%"|cut -d% -f5|sort -nr |head -1
seq 94 |sort -R |head -1 或者echo {1..94} |tr " " "\n"|sort -R |head -1

uniq

註:uniq也是一個帶標準輸入的命令
uniq命令:從輸入中刪除前後相接的重復的行
uniq [OPTION]... [FILE]...
-c: 顯示每行重復出現的次數
-d: 僅顯示重復過的行
-u: 僅顯示不曾重復的行
註:連續且完全相同方為重復
常和sort 命令一起配合使用:
sort userlist.txt | uniq -c

15:05[root@centos7 /data]# sort access_log |cut -d"-" -f1| uniq -c| sort -nr |head
   4870 172.20.116.228 
   3429 172.20.116.208 
   2834 172.20.0.222 
   2613 172.20.112.14 
   2267 172.20.0.227 
   2262 172.20.116.179 
   2259 172.20.65.65 
   1565 172.20.0.76 
   1482 172.20.0.200 
   1110 172.20.28.145 

問:給你兩個文本文件f1,f2,分析兩個文本文件中相同的行和不同的行.
答:sort f1 |uniq >f1b
sort f2 |uniq >f2b
cat f1b f2b |sort |uniq -u :不同的行
cat f1b f2b |sort |uniq -d :相同的行

比較兩個文件區別

  • diff 命令的輸出被保存在一種叫做“補丁”的文件中
    使用 -u 選項來輸出“統一的(unified)” diff格式文件,最適用於補丁文件
  • patch 復制在其它文件中進行的改變(要謹慎使用)
    適用 -b 選項來自動備份改變了的文件
    diff -u foo.conf foo2.conf > foo.patch :對於foo做哪些改變能成為foo2保存到foo.patch中
    patch -b foo.conf foo.patch

  • ss nt :顯示當前遠程連接的主機IP
    ss nt |tr -s " " ":" |cut -d: -f6 |sort|uniq -c |sort -rn

文本處理

grep:文本過濾(模式:pattern)工具

grep, egrep, fgrep(不支持正則表達式搜索)
grep: Global search REgular expression and Print out the line
作用:文本搜索工具,根據用戶指定的“模式”對目標文本逐行進行匹配檢查;打印匹配到的行
模式:由正則表達式字符及文本字符所編寫的過濾條件

  • grep [OPTIONS] PATTERN [FILE...]
    grep root /etc/passwd
    grep "$USER" /etc/passwd:雙引號可以識別變量
    grep ‘$USER‘ /etc/passwd :單引號會把裏面內容全部當做字符
    grep `whoami` /etc/passwd :反向單引號則可以識別命令和變量
  • grep處理命令的時候是按照一行一行處理,每次處理一行存入它自己的內存空間中,處理完之後存入下一行繼續處理直到結束.
  • 命令選項:

    --color=auto: 對匹配到的文本著色顯示
    -m # 匹配#次(行)後停止:因為每次讀入一行
    -v 顯示不被pattern匹配到的行
    -i 忽略字符大小寫
    -n 顯示匹配的行號
    -c 統計匹配到的行數:顯示匹配到pattern的行的總數
    -o 僅顯示匹配到的字符串:因為並不是固定的,所以還是很有意義的
    -q 靜默模式,不輸出任何信息 :echo $? 找到顯示為0 找不到顯示為1,返回值不同
    -A # after, 顯示找到的行外加後#行
    -B # before, 顯示找到的行外加前#行
    -C # context, 顯示找到的行外加前後各#行
    -e 實現多個選項間的邏輯or關系
    grep –e ‘cat ’ -e ‘dog’ file
    並且and的話可以多次過濾即可
    -w 匹配整個單詞:pattern前後不能帶字母,數字或者下劃線(它認為數字和下劃線也是單詞)
    -E 使用ERE:擴展的正則表達式
    -F 相當於fgrep,不支持正則表達式
    -f file 根據模式文件處理:根據文件裏面寫的pattern來過濾,每一行都是一個pattern,每一行的parteen是或的關系

正則表達式

REGEXP: Regular Expressions,由一類特殊字符及文本字符所編寫的模式,其中有些字符(元字符)不表示字符字面意義,而表示控制或通配的功能
程序支持:grep,sed,awk,vim, less,nginx,varnish等
分兩類:
基本正則表達式:BRE
擴展正則表達式:ERE grep -E, egrep
正則表達式引擎:
采用不同算法,檢查處理正則表達式的軟件模塊
PCRE(Perl Compatible Regular Expressions)
元字符分類:字符匹配、匹配次數、位置錨定、分組
man 7 regex

  • 註意:通配符是處理文件名的時候使用的,正則表達式匹配文件內容的,但也可以用ls|grep ....的方式處理
  • 通配符和正則表達式容易混淆的符號等:
    *:通配符中為任意長度任意字符;正則表達式中為匹配前面的字符的0次或任意多次,具有貪婪模式
    .:通配符中沒有意義 ,正則表達式中代表任意的一個字符
    ?:通配符中代表一個任意字符,正則表達式中代表匹配前面字符0次或者1次
    []:中括號內的內容都是代表匹配其中任以一個字符,但是註意通配符中的a-zA-Z等等,是按照小寫大寫小寫大寫的順序,而通配符中的a-z和A-Z分別就是代表小寫字母和大寫字母
    ^ 和[^] 在正則表達式中分別代表行首鉚定和指定範圍外,別混淆了
    系統定義的字符匹配同樣只是代表一個,因此要在外面再加上中括號比如[[:upper:]]

字符匹配:

. 匹配任意單個字符
[] 匹配指定範圍內的任意單個字符,示例:[wang] [0-9] [a-z] [a-zA-Z]
[^] 匹配指定範圍外的任意單個字符
[:alnum:] 字母和數字
[:alpha:] 代表任何英文大小寫字符,亦即 A-Z, a-z
[:lower:] 小寫字母 [:upper:] 大寫字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的範圍廣)
[:cntrl:] 不可打印的控制字符(退格、刪除、警鈴...)
[:digit:] 十進制數字 [:xdigit:]十六進制數字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 標點符號

匹配次數:用在要指定次數的字符後面,用於指定前面的字符要出現的次數

  • 匹配前面的字符任意次,包括0次
    貪婪模式:盡可能長的匹配
    .* 任意長度的任意字符
    \? 匹配其前面的字符0或1次
    \+ 匹配其前面的字符至少1次
    \{n\} 匹配前面的字符n次
    \{m,n\} 匹配前面的字符至少m次,至多n次
    \{,n\} 匹配前面的字符至多n次
    \{n,\} 匹配前面的字符至少n次

  • 註意:: grep " \?"
    其實它能匹配了所有的行(\?前面只要寫任意的一個字符,包括空格什麽的都行),只不過如果沒有任何匹配到的結果的話,它不會顯示紅色匹配到的字符而已,但所有的行都會算到匹配結果中並輸出

位置錨定:定位出現的位置

^ 行首錨定,用於partten的最左側
$ 行尾錨定,用於partern的最右側
^PATTERN$ ,用於partern匹配整行
^$ 空行
^[[:space:]]*$ 空白行
\< 或 \b 詞首錨定,用於單詞模式的左側
\> 或 \b 詞尾錨定,用於單詞模式的右側
\<PATTERN\> 匹配整個單詞

例子:

  • 非#開頭的行
    grep -v "^#" file :這個結果中包含空行
    grep "^[^#]" file :結果中不包含空行,因為空行是0個字符,匹配要的結果是以除了#以外的其他任意一個字符開頭的行,所以空行不在內
  • grep "^$" file:空行顯示出來
  • grep -v "^$" file:去掉文件中空行
  • grep "\<word\>" file 和grep -w "word" file :查找就是這個word的字符,不能多也不能少
  • grep -Ev "^#|^$" file :去掉文件中非#開頭的非空行
  • grep -Ev "(^#|$)" file:同上
去除centos版本號:
09:32[root@centos7 ~]# cat /etc/system-release | grep -Eo "([0-9]+\.){2}[0-9]+"
7.6.1810
09:35[root@centos7 ~]# cat /etc/centos-release |grep -oE "[0-9]+"
7
6
1810
20:31[root@centos7 ~]# cat /etc/centos-release |grep -oE [0-9]+| head -1
7
20:31[root@centos7 ~]# cat /etc/centos-release |grep -oE " [0-9]+" |tr -d " " 
7
20:32[root@centos7 ~]# cat /etc/centos-release |grep -oE "[0-9]+" |grep -m 1 ".*" 
7

20:24[root@centos7 ~]# echo abcd |grep -Eo "."
a
b
c
d
  • 註意當用grep的-o選項的時候,匹配的字符如果在一行中有多個匹配,但是這多個匹配之前有分隔(或者說沒有分隔但每一個字符都是一個匹配),用-o選項結果中會每行顯示一個結果分行顯示,如上面的例子。

分組

分組:\(\) 將一個或多個字符捆綁在一起,當作一個整體處理,如:\(root\)\+
分組括號中的partern匹配到的內容會被正則表達式引擎記錄於內部的變量中,這些
變量的命名方式為: \1, \2, \3, ...
\1 表示從左側起第一個左括號以及與之匹配右括號之間的模式所匹配到的字符
示例: \(string1\+\(string2\)\)
\1 :string1\+\(string2\)

\2 :string2
後向引用:引用前面的分組括號中的模式所匹配字符,而非模式本身
舉例:

20:15[root@centos7 /data]# echo root radt root rawd |grep "\(r..t\).*\1"
root radt root rawd

20:23[root@centos7 /data]# echo roXt radt root radtwd |grep "\(r..t\).*\1"
roXt radt root radtwd

或者or:\|
示例:a\|b: a或b C\|cat: C或cat \(C\|c\)at:Cat或cat
grep "abc\{3\}" :這是c出現了3次相當於 abccc
grep "\(abc\)\{3\}" :abc出現了三次 相當於abcabcabc (分組的第一種應用)
grep "^\(r\|b\)" :以r或者b開頭的,註意要把它括起來作為一個整體
同理: grep "abc\|d":表示abc或者d
grep "ab\(c\|d\)":表示abc或者abd

  • 註意: 括號的地方不是括的(ab)c\|d ,而是包含著這個或字符的部分,註意別括錯了。
    20:00[root@centos7 /data]# df| grep "/dev/sd"|grep "[0-9]\{1,3\}%" -o |grep "[0-9]" -o
    4
    1
    1
    8
    20:15[root@centos7 /data]# df| grep "/dev/sd"|grep "[0-9]\{1,3\}%" -o |grep "[0-9]\+" -o
    4
    1
    18

擴展的正則表達式

egrep

egrep = grep -E
egrep [OPTIONS] PATTERN [FILE...]
擴展正則表達式的元字符:

字符匹配:

. 任意單個字符
[] 指定範圍的字符
[^] 不在指定範圍的字符

次數匹配:

  • 匹配前面字符任意次
    ? 0或1次
  • 1次或多次
    {m} 匹配m次
    {m,n} 至少m,至多n次

    位置錨定:

    ^ 行首
    $ 行尾
    \<, \b 語首
    \>, \b 語尾

    分組:

    ()
    後向引用:\1, \2, ...

    或者:

    a|b a或b
    C|cat C或cat
    (C|c)at Cat或cat

例子:取IP
ifconfig |grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}"
ifconfig eth0 |grep -Eo "([0-9]{1,3}\.){3}[0-9]{1,3}" |head 1

20:23[root@centos7 /data]# ifconfig |grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}"
inet 192.168.36.102  netmask 255.255.255.0  broadcast 192.168.36.255 inet 127.0.0.1  netmask 255.0.0.0
inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255

20:34[root@centos7 /data]# ifconfig ens33 |grep -Eo "([0-9]{1,3}\.){3}[0-9]{1,3}"
192.168.36.102
255.255.255.0
192.168.36.255

找出passwd用戶名和shell相同的:
egrep "^(.*):.*\<\1$" /etc/passwd

VIM文本編輯工具

vi 老版本的文本編輯器
gedit 一個簡單的圖形編輯器
gvim 一個Vim編輯器的圖形版本

vim [OPTION]... FILE...

+# 打開文件後,讓光標處於第#行的行首,+默認行尾
+/PATTERN 讓光標處於第一個被PATTERN匹配到的行的行
–b file 二進制方式打開文件
–d file1 file2… 比較多個文件
-m file 只讀打開文件
vim -e file 或 ex file 直接進入ex模式
如果該文件存在,文件被打開並顯示內容
如果該文件不存在,當編輯後第一次存盤時創建它

  • 註意: +號必須要輸入; pattern後面沒有/;
  • 註意:命令模式查找都不需要再在partern和面加上/了,但是擴展命令模式的地址定界需要pattern兩邊都加上/

    三種主要模式:

    命令(Normal)模式:默認模式,移動光標,剪切/粘貼文本
    插入(Insert)或編輯模式:修改文本
    擴展命令(extended command )模式:保存,退出等
    Esc鍵 退出當前模式
    Esc鍵 Esc鍵 總是返回到命令模式

模式轉換

命令模式 --> 插入模式

i insert, 在光標所在處輸入
I 在當前光標所在行的行首輸入
a append, 在光標所在處後面輸入
A 在當前光標所在行的行尾輸入
o 在當前光標所在行的下方打開一個新行
O 在當前光標所在行的上方打開一個新行

插入模式 --------> 命令模式

ESC

命令模式 --------> 擴展命令模式

:

擴展命令模式 --------> 命令模式

ESC,enter

退出VIM

擴展命令模式:

:q 退出
:q! 強制退出,丟棄做出的修改
:wq 保存退出
:x 保存退出

命令模式

ZZ 保存退出
ZQ 不保存退出

命令模式操作:

命令模式光標跳轉

字符間跳轉:

h: 左 l: 右 j: 下 k: 上
#COMMAND:跳轉由#指定的個數的字符

單詞間跳轉:

w:下一個單詞的詞首
e:當前或下一單詞的詞尾
b:當前或前一個單詞的詞首
#COMMAND:由#指定一次跳轉的單詞數

當前頁跳轉:
  • 移動光標
    H:頁首 M:頁中間行 L:頁底
  • 移動光標所在行
    zt:將光標所在當前行移到屏幕頂端
    zz:將光標所在當前行移到屏幕中間
    zb:將光標所在當前行移到屏幕底端
    行首行尾跳轉:

    ^ 跳轉至行首的第一個非空白字符
    0 跳轉至行首
    $ 跳轉至行尾

    行間移動:

    #G 或者擴展命令模式下:# 跳轉至由第#行
    G 最後一行
    1G, gg 第一行

    句間移動:

    ) 下一句 ( 上一句

    段落間移動:

    } 下一段 { 上一段

    翻屏

    Ctrl+f 向文件尾部翻一屏
    Ctrl+b 向文件首部翻一屏
    Ctrl+d 向文件尾部翻半屏
    Ctrl+u 向文件首部翻半屏

    字符編輯:

    x 刪除光標處的字符
    #x 刪除光標處起始的#個字符
    xp 交換光標所在處的字符及其後面字符的位置
    ~ 轉換大小寫
    J 刪除當前行後的換行符

    替換命令(r, replace)

    r 替換光標所在處的字符
    R 切換成REPLACE模式

    刪除命令:

    d 刪除命令,可結合光標跳轉字符,實現範圍刪除
    d$ 刪除到行尾
    d^ 刪除到非空行首
    d0 刪除到行首
    dw 刪除一個後面單詞
    de 刪除一個後面單詞到詞尾
    db 刪除前面一個單詞
    #COMMAND :先輸入數字,然後跟上上面的命令,多個單詞,多行等刪除
    dG 刪除到最後 dgg 刪除到最前 d#G 刪除到第幾行 :註意都是按照光標處開始的
    同理 :d#l(#dl) d#h(#dh) dj:刪除當前行和下一行 dk:刪除當前行和上一行 類似於d+方向鍵
    同理還有: dH dM dL ,d( d) d{ d} 等,也可以前面加數字做更多修改
    註意沒有dzz dzt dzb

    dd:刪除光標所在的行

    #dd 多行刪除

    D:從當前光標位置一直刪除到行尾,等同於d$
  • d命令其實是剪切的命令
    復制命令(y, yank):

    y 復制,行為相似於d命令
    y$
    y0
    y^
    ye
    yw
    yb
    #COMMAND
    yy:復制行
    #yy 復制多行
    Y:復制整行

  • 其他更多用法同理類似於上面的d
    粘貼命令(p, paste):

    小寫p 緩沖區存的如果為整行,則粘貼當前光標所在行的下方;否則,則粘
    貼至當前光標所在處的後面
    大寫P 緩沖區存的如果為整行,則粘貼當前光標所在行的上方;否則,則粘
    貼至當前光標所在處的前面

    改變命令(c, change)

    c: 修改後切換成插入模式 :命令模式 --> 插入模式 (就相當於先d然後直接進入命令模式,更多用法和d相同)
    c$
    c^
    c0
    cb
    ce
    cw
    #COMMAND

    cc:刪除當前行並輸入新內容,相當於S

    #cc :刪除多行並切換插入模式編輯

    C:刪除當前光標到行尾,並切換成插入模式

一些其他特殊操作:

  • 100iwang [ESC] 粘貼“wang” 100次
  • <start position><command><end position>
    常見Command
    y 復制、 d 刪除、 gU 變大寫、 gu 變小寫
    例如: 0y$ 命令
    0 → 先到行頭
    y → 從這裏開始拷貝
    $ → 拷貝到本行最後一個字符
  • 註意:上面的拷貝到最後一個字符和yy並不一樣,利用p命令就可以知道上面的命令會把拷貝的所有字符看作是一個長字符串,而不是一行
  • di" 光標在”“之間,則刪除”“之間的內容:也可以是() [] {} 等,下同
  • yi( 光標在()之間,則復制()之間的內容
  • vi[ 光標在[]之間,則選中[]之間的內容
  • dt? 刪除字符直到遇見光標之後的第一個 ? 字符
  • yt? 復制字符直到遇見光標之後的第一個 ? 字符

查找

/PATTERN:從當前光標所在處向文件尾部查找
?PATTERN:從當前光標所在處向文件首部查找
n:與命令同方向
N:與命令反方向

撤銷更改

u 撤銷最近的更改
#u 撤銷之前多次更改
U 撤消光標落在這行後所有此行的更改
Ctrl - r 重做最後的“撤消”更改
. 重復前一個操作
#. 重復前一個操作#次

擴展命令模式

基本操作

按“:”進入Ex模式
創建一個命令提示符: 處於底部的屏幕左側
常見命令
w 寫(存)磁盤文件
wq 寫入並退出
x 寫入並退出
q 退出
q! 不存盤退出,即使更改都將丟失
r filename 讀文件內容到當前文件中:可以多次讀入,都放在一起
w filename 將當前文件內容寫入另一個文件
!command 執行命令 :執行命令的時候會退出VIM在外面執行命令,然後再按一次回車回到VIM
r!command 讀入命令的輸出

地址定界:start_pos,end_pos
  • 註意地址定界是按照行來匹配,同時操作最小單位也是一行
    # 具體第#行,例如2表示第2行
    #,# 從左側#表示起始行,到右側#表示結尾行
    #,+# 從左側#表示的起始行,加上右側#表示的行數
    示例:2,+3 表示2到5行
    . 當前行
    $ 最後一行
    .,$-1 當前行到倒數第二行
    % 全文, 相當於1,$
  • 也可以用匹配模式:
    /pattern/ 第一次匹配到pattern的行
  • 註意它從當前行的下一行開始匹配,不匹配當前行,如果當前行的下面沒有找到直到底部,則會回到開頭再次尋找直到第一次匹配到字符的行
    /pat1/,/pat2/ 從第一次被pat1模式匹配到的行開始,一直到第一次被pat2匹配到的行結束
    #,/pat/ :從第#行到匹配到pat的行
    /pat/,$ :從匹配到pat的行到最後一行

    地址定界使用方式:後跟一個編輯命令

    d y
    w file: 將範圍內的行另存至指定文件中
    r file:在指定位置插入指定文件中的所有內容

  • 註意:命令模式查找都不需要再在partern和面加上/了,但是擴展命令模式的地址定界需要pattern兩邊都加上/
  • 例子:
    10,20d: 刪除10到20行
    /^#/d :刪除第一次匹配到的以#開頭的行
    g/^#/d :刪除全部匹配到的以#開頭的行,特殊命令g
    %s/root/administor
在擴展命令模式下完成查找替換操作

格式:s/要查找的內容/替換為的內容/修飾符(/可以換位@或者#等等)
要查找的內容:可使用模式
替換為的內容:不能使用模式,但可以使用\1, \2, ...等後向引用符號;還可以使用“&” 引用前面查找時查找到的整個內容
修飾符:
i 忽略大小寫
g 全局替換(如果不輸入g,則在默認情況下,每一行只替換第一次出現的匹配的字符)
gc 全局替換,每次替換前詢問

  • 註意:查找替換前面必須加上地址定界,不然無法操作,例:
    1. 地址定界範圍s@/etc@/var@g
    2. 地址定界範圍s#/boot#/#i

VIM寄存器

  • 有26個命名寄存器和1個無命名寄存器,常存放不同的剪貼版內容,可以不同會話間
    共享
  • 寄存器名稱a,b,…,z,格式:"寄存器 放在數字和命令之間
    如:3"tyy 表示復制3行到t寄存器中
    "tp 表示將t寄存器內容粘貼
  • 未指定,將使用無命名寄存器
  • 註意: "a3yy 和3"ayy 都是復制3行, 數字放在前後沒有影響,還有更多用法參考y(d)中的那些,都可以使用。
  • 有10個數字寄存器,用0,1,…,9表示,0存放最近復制內容,1存放最近刪除內容。
    當新的文本變更和刪除時,1轉存到2,2轉存到3,以此類推。數字寄存器不能在不同會話間共享

    標記和宏(macro)

  • ma 將當前位置標記為a,26個字母均可做標記, mb 、 mc 等等
  • ‘a 跳轉到a標記的位置,實用的文檔內標記方法,文檔中跳躍編輯時很有用
  • qa 錄制宏 a,a為宏的名稱 (qb,qc.....)
  • q 停止錄制宏
  • @a 執行宏 a
  • @@ 重新執行上次執行的宏

用二進制方式打開文件

vim –b binaryfile
擴展命令模式下,利用xxd命令轉換為可讀的十六進制:%!xxd
插入模式下,編輯二進制文件
擴展命令模式下,利用xxd命令轉換回二進制:%!xxd -r
保存退出

可視化模式

允許選擇的文本塊

v 面向字符
V 面向行
ctrl-v 面向塊

可視化鍵可用於與移動鍵結合使用

w ) } >等

  • \>代表縮進 ,在命令模式下連續按兩次\>也可以縮進

    突出顯示的文字可被刪除,復制,變更,過濾,搜索,替換等

VIM使用多個“窗口”

多文件分割

vim -o|-O FILE1 FILE2 ...
-o: 水平分割
-O: 垂直分割

  • 在窗口間切換:Ctrl+w, Arrow

    單文件窗口分割

    Ctrl+w,s:split, 水平分割
    Ctrl+w,v:vertical, 垂直分割
    ctrl+w,q:取消當前窗口
    ctrl+w,o:取消全部只留下當前窗口
    :wqall 退出 qall! 強制退出不保留

定制vim的工作特性

  • 配置文件:永久有效
    全局:/etc/vimrc
    個人:~/.vimrc (個人的都是隱藏的,全局的不隱藏)
  • 擴展命令模式:當前vim進程有效
    1. 行號
      顯示:set number,簡寫 set nu
      取消顯示:set nonumber, 簡寫 set nonu
    2. 忽略字符的大小寫
      啟用:set ignorecase,簡寫 set ic
      不忽略:set noic
    3. 自動縮進
      啟用:set autoindent,簡寫 set ai
      禁用:set noai
    4. 復制保留格式
      啟用:set paste
      禁用:set nopaste
  • 這個是為了復制代碼的時候不讓它再進行
    1. 顯示Tab和換行符 ^I 和$顯示
      啟用:set list
      禁用:set nolist
    2. 高亮搜索
      啟用:set hlsearch
      禁用:set nohlsearch
    3. 語法高亮
      啟用:syntax on
      禁用:syntax off
  • 比如/etc/passwd中的各種顏色
    1. 文件格式
      啟用windows格式:set fileformat=dos
      啟用unix格式:set fileformat=unix
      簡寫 set ff=dos|unix
  • 默認格式就是linux,修改格式便可以打開文件後使用這個命令,然後保存退出(默認的linux格式打開其他文件不會影響,因為只對這些命令都只對當前的vim進程有效
    1. 設置文本寬度
      set textwidth=65 (vim only):達到多少寬度自動換行,從左到右
      set wrapmargin=15 :從右到左
    2. 設置光標所在行的標識線
      啟用:set cursorline,簡寫 set cul
      禁用:set nocursorline

Set 幫助

  • 擴展模式下:
    :help option-list
    :set or
    :set all
    vi/vim內置幫助
    :help
    :help topic
    Use :q to exit help
  • vimtutor:可以隨便使用它進行練習,哪怕在裏面刪除保存退出也不會對它造成影響

文本處理(grep,vim),正則表達式