vim/sed/awk/grep等文件批處理總結

Vim相關操做

1.基礎python

  • * 和 # 對對當前光標所在的單詞進行搜索
  • %匹配括號移動,包括 (, {, [
  • K 查看man手冊
  • ga 查看ascii值
  • 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.光標移動linux

  • 0 到行頭
  • ^ 到本行的第一個非blank字符
  • $ 到行尾
  • g_ 到本行最後一個不是blank字符的位置
  • fa 到下一個爲a的字符位置
  • ta 到a前一個字符處
  • 3fa 在當前行查找第三個出現的a
  • F和T 和f和t同樣,只不過方向向反

3.可視化選擇git

  • 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.匹配與搜索vim

  • /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.指令bash

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.替換標記this

g 表示行內全面替換。  
p 表示打印行。  
w 表示把行寫入一個文件。  
x 表示互換模板塊中的文本和緩衝區中的文本。  
y 表示把一個字符翻譯爲另外的字符(可是不用於正則表達式)
\1 子串匹配標記
& 已匹配字符串標記

3.元字符集spa

^ 匹配行開始,如:/^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.示例.net

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.1localhost
echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1/' # 把digit 7替換爲7
echo 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 bbb
sed -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打印第一、三、6列

awk'$6 !~ /WAIT/ || NR==1 {print NR,$4,$5,$6}'OFS="\t"netstat.txt     # 匹配第6列不包含WAIT的行,並打印行號、第四、五、6列

awk'NR!=1{print > $6}'netstat.txt   # 按第6列的名字進行文件拆分

ls-l  *.py | awk'{sum+=$5} END {print sum}'  # 統計python文件的總大小

psaux | 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行
相關文章
相關標籤/搜索