Vim相關操作
1.基礎
*
和#
對對當前光標所在的單詞進行搜索- %匹配括號移動,包括
(, {, [
K
查看man手冊ga
查看ascii值g CTRL-G
統計字數,使用Visual模式選取統計部分q:
打開歷史記錄窗口:marks
打開編輯標記窗口,`0
准確回到上一次退出vim的位置gf
打開光標下的指定文件,CTRL-W f
在新窗口中打開- 格式轉換:
:set fileformat=unix
- 增加/減少縮進:
>>/<<
- 塊編輯:
:set virtualedit=all
, 退出:set virtualedit=
。特別適用於表格編輯 gv
再次選定上次選擇的Visual區域CTRL-A
,CTRL-X
對數字加/減ls | vim -
從標准輸入讀取要編輯的內容\c, \C
忽略/不忽略大小寫匹配/
重復前一次搜索zM
關閉所有折行,zR
打開所有折行,zo, zc
打開,關閉某個折行- 剪切版:
"xy
復制到x緩沖區,"xp
粘貼x緩沖區,"+y
復制到系統剪貼板,"+p
從系統剪切板粘貼
2.光標移動
- 0 到行頭
- ^ 到本行的第一個非blank字符
- $ 到行尾
- g_ 到本行最后一個不是blank字符的位置
- fa 到下一個為a的字符位置
- ta 到a前一個字符處
- 3fa 在當前行查找第三個出現的a
- F和T 和f和t一樣,只不過方向向反
3.可視化選擇
- v(單個字符) V(單行) CTRL+v(單列)
- J 把所有的選擇連接起來(變成一行)
- < 或 > 左右縮進
- = 自動縮進
4.替換
:20,100s/bc/a&d/g
# 表示把bc替換為abcd(& 是一個特殊字符,表示被替換的內容。)- :%s/((d+))/="(".(submatch(1)+1).")"/g # % 表示全文搜索,s表示替換,(d+
-
:%s/^/\=line('.')."\t"/ # 在每行的行首添加行號數字和tab
-
:10,20s/^/\=line('.')."\t"/ # 從10到20行的行首添加數字和tab
-
:let counter=0|10,20g//let counter=counter+1|s/^/\=counter."\t" # 從0開始添加數字
5.匹配與搜索
/ab*
“*”匹配任意個(零個或多個)b/\(ab\)*
“ab”作為整體/ab\+
“+”至少一次/folders\=
“=”一次或零次/ab\{m,n}
匹配至少m次,至多n次/foo\|bar
“|”模式中的或操作
\d 數字 [0-9] \D 非數字 [^0-9] \x 十六進制數 [0-9a-fA-F] \X 非十六進制數 [^0-9a-fA-F] \s 空白字符 [ ] (<Tab> 和<Space>) \S 非空白字符 [^ ] (除 <Tab> 和 <Space>之外) \l 小寫字母 [a-z] \L 非小寫字母 [^a-z] \u 大寫字母 [A-Z] \U 非大寫字母 [^A-Z]
Sed相關操作
1.指令
a\ 在當前行下面插入文本。
i\ 在當前行上面插入文本。
c\ 把選定的行改為新的文本。
d 刪除,刪除選擇的行。
D 刪除模板塊的第一行。
s 替換指定字符
h 拷貝模板塊的內容到內存中的緩沖區。
H 追加模板塊的內容到內存中的緩沖區。
g 獲得內存緩沖區的內容,並替代當前模板塊中的文本。
G 獲得內存緩沖區的內容,並追加到當前模板塊文本的后面。
l 列表不能打印字符的清單。
n 讀取下一個輸入行,用下一個命令處理新的行而不是用第一個命令。
N 追加下一個輸入行到模板塊后面並在二者間嵌入一個新行,改變當前行號碼。
p 打印模板塊的行。
P(大寫) 打印模板塊的第一行。
q 退出Sed。
b lable 分支到腳本中帶有標記的地方,如果分支不存在則分支到腳本的末尾。
r file 從file中讀行。
t label if分支,從最后一行開始,條件一旦滿足或者T,t命令,將導致分支到帶有標號的命令處,或者到腳本的末尾。
T label 錯誤分支,從最后一行開始,一旦發生錯誤或者T,t命令,將導致分支到帶有標號的命令處,或者到腳本的末尾。
w file 寫並追加模板塊到file末尾。
W file 寫並追加模板塊的第一行到file末尾。
! 表示后面的命令對所有沒有被選定的行發生作用。
= 打印當前行號碼。
# 把注釋擴展到下一個換行符以前。
2.替換標記
g 表示行內全面替換。 p 表示打印行。 w 表示把行寫入一個文件。 x 表示互換模板塊中的文本和緩沖區中的文本。 y 表示把一個字符翻譯為另外的字符(但是不用於正則表達式) \1 子串匹配標記 & 已匹配字符串標記
3.元字符集
^ 匹配行開始,如:/^sed/匹配所有以sed開頭的行。
$ 匹配行結束,如:/sed$/匹配所有以sed結尾的行。
. 匹配一個非換行符的任意字符,如:/s.d/匹配s后接一個任意字符,最后是d。
* 匹配0個或多個字符,如:/*sed/匹配所有模板是一個或多個空格后緊跟sed的行。
[] 匹配一個指定范圍內的字符,如/[ss]ed/匹配sed和Sed。 [^] 匹配一個不在指定范圍內的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一個字母開頭,緊跟ed的行。 \(..\) 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替換成lovers。 & 保存搜索字符用來替換其他字符,如s/love/**&**/,love這成**love**。 \< 匹配單詞的開始,如:/\<love/匹配包含以love開頭的單詞的行。 \> 匹配單詞的結束,如/love\>/匹配包含以love結尾的單詞的行。 x\{m\} 重復字符x,m次,如:/0\{5\}/匹配包含5個0的行。 x\{m,\} 重復字符x,至少m次,如:/0\{5,\}/匹配至少有5個0的行。 x\{m,n\} 重復字符x,至少m次,不多於n次,如:/0\{5,10\}/匹配5~10個0的行。
4.示例
sed 's/book/books/' file # 字符串替換sed -n 's/test/TEST/p' file # 只打印那些發生替換的行
sed -i 's/book/books/g' file # 替換源文件sed 's/book/books/g' file # 全局替換echo sksksksksksk | sed 's/sk/SK/3g' # 從第三個開始替換sed '/^$/d' file # 刪除空行sed '2d' file # 刪除第2行sed '2,$d' file # 刪除第2行至文件末尾sed '$d' file # 刪除最后一行sed '/^test/d' file # 刪除以test開頭的行echo this is a test line | sed 's/\w\+/[&]/g' # 匹配單詞,替換成[單詞]的形式sed 's/^192.168.0.1/&localhost/' file # 把以192.168.0.1開頭的行替換為192.168.0.1localhostecho this is digit 7 in a number | sed 's/digit \([0-9]\)/\1/' # 把digit 7替換為7echo aaa BBB | sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1/' # 交換aaa和BBB的位置sed -n 's/\(love\)able/\1rs/p' file # 匹配loveable,替換為lovers,並打印出來這些替換的行sed '表達式' | sed '表達式' # 多個sed通過管道連接sed -n '/test/,/check/p' file # 打印test到check直接的行sed -n '5,/^test/p' file # 打印從第5行開始,到第一個以test開始之間的所有行sed '/test/,/west/s/$/aaa bbb/' file # 把test到west之間的行的末尾替換成aaa bbbsed -e '1,5d' -e 's/test/check/' file # 先刪除第1行到第5行,再把test替換為check
awk相關操作
1. 內建變量
$0 | 當前記錄(這個變量中存放着整個行的內容) |
$1~$n | 當前記錄的第n個字段,字段間由FS分隔 |
FS | 輸入字段分隔符 默認是空格或Tab |
NF | 當前記錄中的字段個數,就是有多少列 |
NR | 已經讀出的記錄數,就是行號,從1開始,如果有多個文件話,這個值也是不斷累加中。 |
FNR | 當前記錄數,與NR不同的是,這個值會是各個文件自己的行號 |
RS | 輸入的記錄分隔符, 默認為換行符 |
OFS | 輸出字段分隔符, 默認也是空格 |
ORS | 輸出的記錄分隔符,默認為換行符 |
FILENAME | 當前輸入文件的名字 |
2.示例
awk
'BEGIN{FS=":"} {print $1,$3,$6}'
OFS=
"\t"
/etc/passwd # 在處理前設置使用:作為分隔符,對/etc/passwd打印第1、3、6列
awk
'$6 !~ /WAIT/ || NR==1 {print NR,$4,$5,$6}'
OFS=
"\t"
netstat
.txt
# 匹配第6列不包含WAIT的行,並打印行號、第4、5、6列
awk
'NR!=1{print > $6}'
netstat
.txt
# 按第6列的名字進行文件拆分
ls
-l *.py |
awk
'{sum+=$5} END {print sum}'
# 統計python文件的總大小
ps
aux |
awk
'NR!=1{a[$1]+=$6;} END { for(i in a) print i ", " a[i]"KB";}'
# 統計每個用戶進程占用內存的大小awk
'length>80'
file
# 獲取長度大於80的行netstat
-ntu |
awk
'{print $5}'
|
cut
-d: -f1 |
sort
|
uniq
-c |
sort
-nr
# 按連接數查看客戶端IP
grep相關操作
grep 'nos_client' -nr . # n表示打印行號,r表示遞歸查找
grep -noE 'gm_client\.[a-zA-Z_]+' vhttpservice.py # E表示使用正則表達式匹配,o表示僅打印匹配結果
$grep -C 5 'parttern' inputfile //打印匹配行的前后5行$grep -A 5 'parttern' inputfile //打印匹配行的后5行$grep -B 5 'parttern' inputfile //打印匹配行的前5行