第六章,文本处理工具和正则表达式
更多筆記點擊查看
Linux學習從入門到打死也不放棄,完全筆記整理(持續更新)
https://blog.51cto.com/13683480/2095439
筆記整理起始時間:2018年4月7日14:15:07
?
本章內容:
各種文本工具來查看、分析、統計文本
cat,tac,rev,more,less,head,tail,cut,paste,wc,uniq,sort,diff
grep
正則表達式
擴展正則表達式
vim
?
支持標準輸入的命令|
?????? ?cat tr mail bc
?????? ?more less head tail cut wc sort uniq grep
?
抽取文本的工具
?????? ?文本內容:less和cat
?????? ?文本截取:head和tail
?????? ?按列抽取:cut
?????? ?按關鍵字抽取:grep
?????? ?
文件查看命令:
?????? ?cat,tac,rev
?????? ?cat -E ????????? 顯示行結束符$
????????????? ?-n????????? ?對顯示出的每一行進行編號
????????????? ?-A????????? 顯示所有控制符
????????????? ?-b????????? 非空行編號
????????????? ?-s?????????? 壓縮連續的空行成一行
?????? ?tac file??? 上下反向查看文件
?????? ?rev file??? 左右反向查看文件
?
分頁查看文件內容:
?????? ?more:???????????????? 分頁查看文件
?????? ?more -d file?? ?顯示翻頁及退出提示
?????? ?less??????????????? ?一頁一頁地查看文件或stdin輸出
????????????? ?查看時有用的命令包括:
????????????? ?/文本????? ?搜索文本
????????????? ?n/N??????? 跳到下一個或上一個匹配
????????????? ?less命令為man命令默認使用的分頁工具
?????? ?
顯示文本前或后行內容
?????? ?head file??????? ?默認查看文件前10行
????????????? ?-c1000?????????? 指定獲取前1000字節
????????????? ?-n#?????????????? 指定獲取前#行
????????????? ?-#???????????????? 指定前#數 (跟-n#好像沒什么不同)
?????? ?
?????? ?tail file?????????? ?默認查看文件后10行
????????????? ?-c50????????????? 指定獲取后50個字節
????????????? ?-n#?????????????? 指定獲取后#行
????????????? ?-#???????????????? ?指定獲取后#行
????????????? ?-f????????????????? ?跟蹤顯示文件fd新追加的內容,常用于日志監控
????????????????????????????????????????? ?但是文件如果被刪除,無法發現
????????????? ?-F????????????????? ?跟蹤文件名,相當于--follow=name ?--retry
????????????????????????????????????????? ?當文件被刪除時會受到提示
?????? ?tailf file????????? 類似于tail -f,當文件不增長(比如刪除)時并不訪問文件
?
按列抽取文本cut,合并文件paste
?????? ?cut [option]...[file]...
????????????? ?-d“”????????? 指明分隔符,默認tab
????????????? ?-f filed??? 指明第幾列
???????????????????? #?????????????????? 第#個字段
???????????????????? 1,5???????????????? 第1和第5列
???????????????????? 1-5??????????????? 第1-5列
???????????????????? 1-3,5???????????? 第123,5列
????????????? ?-c1-15,????????????? 按字符切割
????????????? ?
????????????? ?cut -d: -f6-7 /etc/passwd??? ?
???????????????????? 以冒號為分隔符取/etc/passwd的第6-7列
????????????? ?cut -d: -f1,7 /etc/passwd /etc/shadow|cat -n
???????????????????? 以冒號為單位/etc/passwd和/etc/shadow的第1和第7列 且顯示行數
???????????????????? ?--output-delimiter=STRING?????? ?指定輸出分隔符
????????????? ?如:
???????????????????? cut? -d: -f1-3 --output-delimiter=@ ?/etc/passwd
??????????????????????????? 以:為分隔符取etc/passwd 第1-3列,且輸出以@為分隔符
?????? ?
????????????? ?cut -c1-14,30-45 /etc/profile
???????????????????? 取/etc/profile 每行1-14 30-45個字符
?????? ?
?????? ?paste [option]...[file]...??? ?合并兩個文件同行號的列到一行
????????????? ?-d"" 指定分隔符,默認用tab
????????????? ?-s ???????? 所有的行合成一行顯示
????????????? ?paste f1 f2??????????? ?行合并
????????????? ?paste -s f1 f2 ????? 列顯示變行顯示
?
分析文本的工具:
?????? ?wc:文本數據統計
????????????? ?計算單詞總數,行總數,字節總數和字符總數
????????????? ?可以對文件或者stdin中的數據運行
????????????? ?wc /etc/profile
???????????????????? 76 ???????? ?252 ???? ?1795 ???? ?/etc/profile
???????????????????? 行數?????? 單詞數??? 字節數
????????????? ?常用選項
???????????????????? -l???? 只計算行數
???????????????????? -w?? 只計算單詞總數
???????????????????? -c 只計算字節總數
???????????????????? -m 只計算字符總數
???????????????????? -L 顯示文件中最長行的長度
?????? ?
?????? ?sort:文本排序sort
????????????? ?把整理過的文本顯示在stdout,不改變原始文件
????????????? ?sort files? ???? 默認是按字符排序文件
????????????? ?常用選項:
???????????????????? -r ? 反向排序
???????????????????? -R?? 隨即排序
???????????????????? -n?? 執行按數字大小整理
???????????????????? -f ?? 選項忽略(fold)字符串中的字符大小寫
???????????????????? -u ? 選項(獨特,unique)刪除輸出中的重復行
???????????????????? -t"#"?????? 使用#作為字段界定符
???????????????????? -k"X"????? 按照使用#字符分隔的第X列來整理,能夠使用多次
????????????? ?例:
???????????????????? cut -d: -f1-3 ?/etc/passwd|sort -t: -k3 -n
??????????????????????????? 以:為分隔符取/etc/passwd前3列,且按照uid數字大小排序
?
uniq命令:
?????? ?uniq:從輸入中刪除前后相接的重復的行
?????? ?uniq [option]...[file]...
????????????? ?-c?????????? ?顯示每行重復出現的次數
????????????? ?-d????????? 僅顯示重復過的行
????????????? ?-u?? ???? 僅顯示不曾重復的行
????????????? ?注意:連續且完全相同方為重復
?????? ?常和sort命令一起配合使用:
????????????? ?sort userlist.txt |uniq -c
????????????????????
比較文件:
?????? ?比較兩個文件之間的區別
????????????? ?diff file1 file2
???????????????????? 比較文件,會標記不同的行
??????????????????????????? ?1,51c1,51,表示1-51行有區別
????????????? ?diff命令的輸出被保存在一種叫做“補丁“的文件中
???????????????????? 使用 ?-u? 選項來輸出“統一的(unified)"diff格式文件,最適合用于補丁文件
????????????? ?patch 復制在其他文件中進行的改變(要慎重使用)
???????????????????? 適用 ?-b 選項來自動備份改變了的文件
????????????? ?例:
????????????? ?diff -u f11 f22 > f33.diff
????????????? ?rm -rf file1
????????????? ?patch -b f22 f33.diff
???????????????????? 使用f11 f22的diff文件f33.diff恢復f11文件
??????????????????????????? 原f22文件會被改名備份為f22.orig,f22文件即為原f11文件
????????????? ?
練習1:
?????? ?1.找出ifconfig 網卡名 命令結果中本機的IPv4地址
????????????? ?ifconfig ens33|head -n2|tail -n1|tr -s " " |cut -d" " ?-f3
?????? ?2.查出分區空間使用率的最大百分比值
????????????? ?df|tr -s " " "%"|cut -d"%" -f5|sort -nr|head -n2|tail ?-n1
?????? ?3.查出用戶UID最大值的用戶名、UID及shell類型
????????????? ?cat /etc/passwd|cut -d: -f1,3,7|sort -nr -t":" -k2|head ?-1
?????? ?4.查出/tmp的權限,以數字方式顯示
????????????? ?stat /tmp|head -n4|tail -1|cut -d: -f2|tr -dc "[:digit:]\n"
?????? ?5.統計當前連接本機的每個遠程主機IP的連接數,并按從大到小排序
????????????? ?netstat -nt|tr -s " "|cut -d" " -f5|uniq -c|tr -s ' ' |sort -nr ?
????????????? ?-c"" -k2
????????????? ?cat access_log |cut -d' ' -f1|sort|uniq -c|sort -nr
?
Linux文本處理三劍客
?????? ?grep:文本過濾(模式:pattern)工具
????????????? ?grep,egrep,fgrep(不支持正則表達式搜索)
?????? ?sed:stream editor,文本編輯工具
?????? ?awk:linux上的實現gawk,文本報告生成器
?
grep:Global search ?Regular expression and Print out the line
?????? ?作用:文本搜索工具,根據用戶指定的“模式”對目標文本逐行進行匹配檢查
????????????? ?打印匹配到的行
?????? ?模式:由正則表達式字符及文本字符所編寫的過濾條件
?????? ?grep [options] pattern [file]...
????????????? ?例:
????????????? ?grep root /etc/passwd???????? ?在/etc/passwd 中搜索含有root的行并輸出
????????????? ?grep "$USER" /etc/passwd?? ?在/etc/passwd中搜索當前用戶,并輸出行
????????????? ?grep '$USER' /etc/passwd ? ?在/etc/passwd中搜索字符$USER,并輸出行
?????? ??????? grep `whoami` ?/etc/passwd 支持命令調用如`whoami`
????????????? ?ls |grep ok???????????????????????????????? 在ls的輸出結果中匹配含有“ok”的選項并輸出
?????? ?
?????? ?--color=auto:???? ?對匹配到的文本著色顯示
?????? ?-v???????????????????????? ?取反,顯示不被pattern匹配到的行
?????? ?-i????????????????????????? ?忽略字符大小寫
?????? ?-n??????????????????????? ?顯示匹配的行數
?????? ?-c???????????????????????? ?統計匹配的行數,僅顯示行數,不輸出匹配到的信息
?????? ?-o??????????????????????? ?僅顯示匹配到的字符串
?????? ?-q??????????????????????? ?靜默模式,不輸出任何信息,
?????????????????????????????????? ?結果存在變量 $? 中,有匹配為0,沒有匹配為1
?????? ?-A#:after??????? ?連同匹配到的行數的后#行一起輸出
?????? ?-B#:befor?????????? 連同匹配到的行數的前#行一起輸出
?????? ?-C#:context 前后#行一起輸出
?????? ?-e:???????????????????? 實現多個選項間的邏輯or關系
????????????? ?grep -e 'cat' -e 'dog' file
?????? ?-w??????????????????????? ?匹配整個單詞,僅包含的不輸出,如只匹配roo,就不會輸出root
?????????????????????????????????? ?字母數字下劃線都算單詞的一部分,其他符號為分隔符
?????? ?-E???????????????????????? ?使用ERE(擴展正則表達式)
?????? ?-F???????????????????????? ?相當于fgrep,不支持正則表達式
?????? ?
?????? ?grep -f? file 匹配文件中的pattern,或關系
?????? ?i 特殊顯示,會在行首顯示文件名
?????? ?$?,存儲上一個命令的返回值,ture為 0,錯誤為非0
?????? ?
正則表達式:
?????? ?man 7 regex
?????? ?regexp:由一類特殊字符及文本字符所編寫的模式(pattern),其中有些字符
?????? ?(元字符)不表示字符字面意義,而表示控制或通配的功能
?????? ?程序支持:grep,sed,awk,vim,less,nginx,varnish等
?????? ?分兩類:
????????????? ?基本正則表達式:BRE
????????????? ?擴展正則表達式:ERE
???????????????????? grep -E , ?egrep支持擴展正則表達式
?????? ?正則表達式引擎:
????????????? ?采用不同算法,檢查處理正則表達式的軟件模塊
????????????? ?PCRE(Perl Compatible Regular ?Expreesions)
?????? ?元字符分類:
????????????? ?字符匹配,匹配次數,位置錨定,分組
?????? ?
字符匹配:
????????????? ?.??????????????????? ?匹配任意單個字符
????????????? ?[abcA-Z1-5]?? ?匹配指定范圍內的任意單個字符
????????????? ?[^abc]??????????? ?匹配指定范圍外的任意單個字符
????????????? ?[:alnum:] 字母和數字
????????????? ?[:alpha:]? 代表任何英文大小寫字符,A-Z,a-z
????????????? ?[:lower:]? 小寫字母
????????????? ?[:upper:]? 大寫字母
????????????? ?[:digit:]??? 十進制數字
????????????? ?[:xdigit:]?? 十六進制數字
????????????? ?[:blank:]? 空白字符(空白和制表符)
????????????? ?[:space:]? 水平和垂直的空白字符(比[:blank:]包含的范圍廣)
????????????? ?[:cntrl:]??? ?不可打印的控制字符(退格,刪除,警鈴。。。)
????????????? ?[:graph:]? 可打印的非空白字符
????????????? ?[:print:]??? 可打印字符
????????????? ?[:punct:]? 標點符號
?????? ?例:
????????????? ?ls|grep ...? ??? 顯示所有三個字符,多余部分不會標紅
????????????? ?ls|grep "..."???? 顯示3個字符組成的單詞
?????? ?
?????? ?ps:[.]放在中括號里面就是.本身
匹配次數:
?????? ?用在要指定次數的字符后面,用于指定前面的字符要出現的次數
????????????? ?*???????????? ?匹配前面的字符任意次,包括0次
?????????????????????????????????? ?貪婪模式:盡可能長的匹配
????????????? ?.*??????????? ?任意長度的任意字符
????????????? ?\??????????? 匹配其前面的字符0次或1次
????????????? ?\+?????????? 匹配其前面的字符至少1次
????????????? ?\{n\} 匹配前面的字符n次
????????????? ?\{m,n\}??? ?匹配其前面的字符至少每次,至多n次
????????????? ?\{,n\}?????? ?匹配前面出現的字符至多n次
????????????? ?\{n,\}?????? ?匹配前面出現的字符至少n次
????????????? ?
位置錨定:
?????? ?定位出現的位置
????????????? ?^???????????????????????????????? ?行首錨定,用于模式的最左側
????????????? ?$???????????????????????????????? ?行尾錨定,用于模式的最右側
????????????? ?^pattern$??????????????????? ?用于模式匹配整行
???????????????????? ^$?????????????????????????????? 空行
???????????????????? ^[[:space:]]*$???????? 空白行
????????????? ?\< \b?????????????????????????? ?詞尾錨定,用于單詞模式的左側
????????????? ?\> \b?????????????????????????? ?詞尾錨定,用于整個單詞的右側
????????????? ?\<pattern\>???????????????? ?匹配整個單詞
?
分組:
?????? ?\(\)?? 將一個或者多個字符捆綁在一起,當做一個整體進行處理,如:
????????????? ?\(root\)\+????????????? ?匹配root最少出現一次
???????????????????? echo rootroot? |grep -o ?"\(root\)\+"
?????? ?分組括號中的模式匹配到的內容會被正則表達式引擎記錄于內部的變量中
?????? ?這些變量的命名方式為;\1, \2, \3...
???????????????????? echo rootpppproot|grep -o ?"\(root\).*\1"
?????? ?\1 ? ?表示從左側起第一個左括號以及與之匹配右括號之間的模式所匹配到的字符
?????? ?示例:
????????????? ?\(string1\+\(string2\)*\)
???????????????????? \1:string\+\(string2\)*
???????????????????? \2:string2
????????????? ?后項引用:引用前面的分組括號中的模式所匹配的字符,而非模式本身
?????? ?
?????? ?或者:\|
????????????? ?示例a\|b a或b
????????????? ?C\|cat???????????? C或cat
????????????? ?\(C\|c\)at Cat或cat
?
練習2:
?????? ?1.顯示/proc/meminfo文件中以大小s開頭的行(要求使用兩種方法)
????????????? ?cat /proc/meminfo |grep -i ^s
????????????? ?cat /proc/meminfo |grep "\(^s.*\)\|\(^S.*\)"
?????? ?2.顯示/etc/passwd文件中不以/bin/bash結尾的行
????????????? ?cat /etc/passwd|grep -v "/bin/bash\>"
?????? ?3.顯示用戶hello默認的shell程序
????????????? ?getent passwd hello|cut -d: -f7
????????????? ?getent passwd hello|grep -o "/.*\>"
?????? ?4.找出/etc/passwd文的兩位或三位數
????????????? ?cat /etc/passwd|grep -o "\<[0-9]\{2,3\}\>"|cat -n???
?????? ?5.顯示Centos7的/etc/grub2.cfg文件中,至少以一個空白字符開頭的且后面
?????? ?有非空白字符的行
????????????? ?cat /etc/grub2.cfg|grep "^[[:space:]]\+.*..*$"
?????? ?6.找出"netstat-tan"命令結果中以LISTEN后跟任意多個空白字符結尾的行
????????????? ?netstat -tan|grep "LISTEN[[:space:]]\+$"
?????? ?7.顯示CentOS7上所有系統用戶的用戶名和UID
????????????? ?getent passwd|cut -d: -f1,3
?????? ?8.添加用戶bash、testbash、basher、sh、nologin(其shell為/sbin/nologin)
?????? ?找出/etc/passwd用戶名和shell同名的行
????????????? ?getent passwd|grep "^\(..*\)\>.*\<\1$"
?????? ?9.利用df和grep,取出磁盤各分區利用率,并從大到小排序
????????????? ?df|grep dev/sd|tr -s ' ' |cut -d' ' -f1,5|sort -t' ' -k2 ?-nr
???????????????????? 保留磁盤名稱
????????????? ?df|grep dev/sd|grep -o "[0-9]\+%"|sort ?-nr
???????????????????? 不保留磁盤名稱
?
egrep:
?????? ?egrep = grep -E
?????? ?egoup [options] pattern [file...]
?????? ?支持擴展的正則表達式
????????????? ?
擴展的正則表達式的元字符:
?????? ?字符匹配:
????????????? ?.??????????????????? ?任意單個字符
????????????? ?[abc]????????????? ?指定范圍的字符
?????? ??????? [^abc]??????????? 不在指定范圍的字符
????????????? ?[:alnum:] 。。。。
?????? ?
?????? ?次數匹配:
????????????? ?*??????????????????? ?匹配前面字符任意次
????????????? ??????????????????? ?匹配前面字符0或1次
????????????? ?+?????????????????? ?1次或多次
????????????? ?{m}??????????????? 匹配m次
????????????? ?{m,n}???????????? 至少m次,至多n次
?????? ?
?????? ?位置錨定:
????????????? ?^?????????????????? 行首
????????????? ?$?????????????????? 行尾
????????????? ?\< \b???????????? ?單詞首
????????????? ?\> \ba??????????? ?單詞尾
?????? ?
?????? ?分組:
????????????? ?()????????????? ?分組
????????????? ?\1,\2????????????? 后項引用
?????? ?或者:
????????????? ?a|b???????????????? a或者b
????????????? ?C|cat????????????? C或cat
????????????? ?(C|c)at ?? Cat或cat
?????? ?
練習3:
?????? ?1.顯示三個用戶root、mage、wang的UID和默認shell
????????????? ?cat /etc/passwd|egrep "^(root)\>|^(hello)\>|^(lily)"|cut -d: ?-f1,3,7
????????????? ?getent passwd root hello lily|cut -d: -f1,3,7
?????? ?2.找出/etc/rc.d/init.d/functions文件中行首為某單詞(包括下劃線)后面跟
?????? ?一個小括號的行
????????????? ?cat /etc/rc.d/init.d/functions |egrep ?"^[[:alpha:]]+.*\>\(\)"
?????? ?3.使用egrep取出/etc/rc.d/init.d/functions中其基名和目錄名
????????????? ?echo /etc/init.d/functions/ |egrep -o ?"\<[[:alpha:]]+/?$"
????????????? ?echo /etc/init.d/functions |egrep -o ?"/.*\>/"
?????? ?5.統計last命令中以root登錄的每個主機IP地址登錄次數
????????????? ?last|egrep "^root\>"|tr -s ' ' |cut -d' ' -f3|sort|uniq ?-c
?????? ?6.利用擴展正則表達式分別表示0-9,10-99,100-199,200-249,250-255
????????????? ?[0-9]?????? [1-9][0-9] 1[0-9][0-9]?? ?2[0-4][0-9]???? ?25[0-5]
?????? ?7.顯示ifconfig命令結果中所有ipv4地址
????????????? ?ifconfig |egrep -o "\<(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"
????????????? ?ifconfig |egrep -o "\<(([1-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>" ?
?????? ?8.將此字符串:welcome to magedu linux ?中的每個字符去重并排序,重復次數
?????? ?多的排到前面
????????????? ?echo welcome to magede linux|tr -d ' '|grep -o ?.|sort|uniq -c|sort -nr
?
????????????? ?
vim簡介:
?????? ?vi:visual interface,文本編輯器
?????? ?文本:ASCII,unicode
?????? ?文本編輯種類:
????????????? ?行編輯器:sed
????????????? ?全屏編輯器:nano,vi
????????????? ?vim:vi improved
?????? ?其他編輯器:
????????????? ?gedit?????? 一個簡單的圖形編輯器
????????????? ?gvim?????? 一個vim編輯器的圖形版本
?
vim:打開文件
?????? ?vim [option]...file...
????????????? ?vim +# file??????????? ?打開文件后,讓光標處于第#行的行首,
???????????????????? +?????????????????? 默認最后一行的的行首
????????????? ?+/pattern ??????????? ?打開文件后,直接讓光標處于第一個被pattern匹配到的
????????????????????????????????????????? ?行的行首
????????????? ?-b ? file????????? 二進制方式打開文件
????????????? ?-d file1 file2... 比較多個文件,會顯示不同的位置
????????????? ?-m file ???????? 只讀打開文件
?????? ?ex file 或者vim -e?????? 直接進入ex模式
?????? ?如果該文件存在,文件被打開并顯示內容
?????? ?如果該文件不存在,當編輯后第一次存盤時創建文件
?
vim:模式
?????? ?三種主要模式:
????????????? ?命令(normal)模式:默認模式,移動光標,剪切/粘貼文本
????????????? ?插入(insert)或編輯(edit)模式:修改文本
????????????? ?擴展命令(extended command)模式:保存,退出等
?????? ?R:改寫模式
?????? ?Esc鍵退出當前模式
?????? ?ese ese 總是返回到命令模式
?????? ?
模式轉換:
?????? ?命令模式-->插入模式
????????????? ?i:insert,在光標所在處輸入
????????????? ?I:在當前光標所在行的行首輸入
????????????? ?a:append,在光標所在處后面輸入
????????????? ?A:在當前光標所在行的行尾輸入
????????????? ?o:在當前光標所在行的下方打出一個新行
????????????? ?O:在當前光標所在行的上方打開一個新行
?????? ?
?????? ?插入模式-->命令模式
????????????? ?Esc
?????? ?
?????? ?命令模式-->擴展命令模式
????????????? ?:
?????? ?
?????? ?擴展命令模式-->命令模式
????????????? ?Esc,enter
?
關閉文件:
?????? ?擴展模式:
????????????? ?:q??????????????? ?退出
????????????? ?:q!??????? ?強制退出,丟棄做出的修改
????????????? ?:wq???????????? ?保存退出
????????????? ?:x??????????????? ?保存退出
?????? ?命令模式:
????????????? ?ZZ???????????????? 保存退出
????????????? ?ZQ??????????????? 不保存退出
?
擴展模式:
?????? ?:進入ex模式
?????? ?創建一個命令提示符:處于底部的屏幕左側
?????? ?命令:
????????????? ?w ???????????????? ?寫(存)磁盤文件
????????????? ?wq???????????????? ?寫入并退出
????????????? ?x??????????????????? ?寫入并退出
????????????? ?q?????????????????? 退出
????????????? ?q!??????????????? ?不存盤退出,即使更改都將丟失
????????????? ?r filename????? ?讀文件內容到當前文件中
????????????? ?w filename???? ?將當年文件內容寫入另一個文件
????????????? ?!cmd????????????? ?執行命令
????????????? ?r!cmd??????????? ?讀入命令的輸出
?
命令模式光標跳轉:
?????? ?字符間跳轉:
????????????? ?h:? ?左??? ?
????????????? ?l:?? ?右
????????????? ?j:?? ?下
????????????? ?k: ?? 上
????????????? ?#command:跳轉由#指定的個數的字符
???????????????????? 比如33j,向下跳33行
?????? ?
?????? ?單詞間跳轉:
????????????? ?w:下一個單詞的詞首
????????????? ?e:當前或下一個單詞的詞尾
????????????? ?b:當前或前一個單詞的詞首
????????????? ?#cmd:由#指定一次跳轉的單詞數
?????? ?
?????? ?當前頁跳轉:
????????????? ?H: 頁首
????????????? ?M:頁中間行
????????????? ?L:? ?頁底
?????? ?
?????? ?行首行尾跳轉:
????????????? ?^:??? 跳轉至行首的第一個非空白字符
????????????? ?0:? ?跳轉至行尾
????????????? ?$:???? 跳轉至行尾
?????? ?
?????? ?行間移動:
????????????? ?##G,(擴展模式:#):????? 跳轉至由##指定行
????????????? ?G:??????????????????????????????????? ?最后一行
????????????? ?1G,gg???????????????????????????????? ?第一行
?????? ?
????????????? ?句間移動
???????????????????? )????? 下一句
???????????????????? (????? 上一句
?????? ?
?????? ?段落間移動:
????????????? ?}????? 下一段
????????????? ?{????? 上一段
?????? ?
命令模式:
?????? ?翻屏操作:??? ?
????????????? ?ctrl+f???????????? 向文件尾部翻一屏
????????????? ?ctrl+b??????????? 向文件首部翻一屏
????????????? ?ctrl+d??????????? 向下半屏
????????????? ?ctrl+u ????????? 向上半屏
?????? ?
?????? ?字符編輯:
????????????? ?x??????????????????? ?刪除光標處字符
????????????? ?#x ??????????????? ?刪除光標處起始的#個字符
????????????? ?xp????????????????? ?交換光標所在處的字符及其后面字符的位置
????????????? ?~?????????????????? ?轉化大小寫
????????????? ?J??????????????????? ?刪除當前行后的換行符
?????? ?
?????? ?替換命令:
????????????? ?r??????????????????? ?替換光標所在處的字符
????????????? ?R ???????????????? 切換成Replace,改寫模式
?????? ?
?????? ?刪除命令:
????????????? ?d?????????????????? ?刪除命令,可結合光標跳轉字符,實現范圍刪除
????????????? ?d$???????????????? ?刪除至行尾
????????????? ?d^???????????????? ?刪除到非空行首
????????????? ?d0???????????????? ?刪除到行首
????????????? ?dw???????????????? ?向右刪除一個單詞
????????????? ?de???????????????? ?向右刪除一個單詞
????????????? ?db???????????????? ?向左刪除一個單詞
?????? ?dd???????????????? ?刪除光標所在的行
????????????? ?#dd:???? ?多行刪除
????????????? ?D?????????????????? ?從當前光標位置一直刪除到行尾,留空行,等同于d$
??????? dG?? ??? ?:從當前行刪除到最后1行
?? ? ?? dgg?? ??? ?:從當前行刪除到第1行
?????? ?
?????? ?復制命令:
????????????? ?y?????????????????? ?復制,行為相似于d命令
????????????? ?y$????????????????? ?從光標處復制到行尾
????????????? ?y0????????????????? ?從光標處復制到行首
????????????? ?y^???????????????? ?復制到非空行首
????????????? ?ye????????????????? ?拷貝后一個單詞
????????????? ?yw
????????????? ?yb???????????????? ?拷貝前單詞
?????? ?yy????????????????? ?復制整行
????????????? ?#yy???????? 復制多行
?????? ?Y?????????????????? ?復制整行
??????? yG?? ??? ?:從當前行復制到最后一行
?? ?????ygg?? ??? ?:從當前行復制到第一行???????
?????? ?粘貼命令:
????????????? ?p:緩沖區存的如果為整行,則粘貼當前光標所在行的下方;否則,則粘貼
???????????????????? 至當前光標所在處的后面
????????????? ?P:緩沖區存的如果為整行,則粘貼當前光標所在行的上方;否則,則粘貼
???????????????????? 至當前光標所在處的前面
?????? ?
?????? ?改變命令:
????????????? ?c:修改后切換成插入模式
????????????? ?
????????????? ?命令模式--->插入模式
???????????????????? c$?????????? 刪除至行尾,并切換成插入模式
???????????????????? c^
???????????????????? c0
???????????????????? cb
???????????????????? cw
???????????????????? ?#command
????????????? ?cc????????????????? ?刪除當前行并輸入新內容
???????????????????? #cc???????? 多行刪除并輸入新內容
????????????? ?C?????????????????? ?刪除當前光標到行尾,并切換成插入模式
????????????? ?
?????? ?其他操作
????????????? ?100iwang【esc】???????? 粘貼wang ?100次
????????????? ?<stat position><command><end ?position>
???????????????????? ?command:
??????????????????????????? y 復制??? d 刪除 ? gU 變大寫 gu 變小寫
???????????????????? 例如:
???????????????????? 0y$? 命令意味著:
???????????????????? 0???? 先到行頭
???????????????????? y???? 從這里開始拷貝
???????????????????? $???? 拷貝到本行最后一個字符
??????????????????????????? ?ye:從當前位置拷貝到本單詞的最后一個字符
?
擴展命令模式:
?????? ?地址定界:
????????????? ?:start_pos,end_pos
????????????? ?:#? (y,d..)???????????? ?具體第幾行,例如:2表示第2行,可以直接進行復制、刪除等
????????????? ?:#,@(y,d..) 從第#行起,到第@行止,執行命令
????????????? ?:#,+@(y,d..)????? 從第#起,到第#+@行
????????????????????????????????????????? ?如:2+5,表示從第2行到第7行
????????????? ?:.??????????????????????? 表示當前行
?????? ??????? :$?????????????????????? ?最后一行
???????????????????? .,$-1 當前行到倒數第二行
????????????? ?:%??????????????? ?全文
???????????????????? 如:%d?? 刪除全文
?????? ?
?????? ?匹配:支持正則表達式
????????????? ?/pat1/,/pat2/? ?
???????????????????? 從第一次被pat1模式匹配到的行開始,一直到第一次被pat2匹配到的行結束
????????????? ?#,/pat/?????????? 第#行到被匹配行
????????????? ?/pat/,$?????????? ?被匹配行到最后一行
????????????? ?使用方式:后跟一個編輯命令
???????????????????? d
???????????????????? y
???????????????????? w file???????????? 將范圍內的行另存至指定文件中
???????????????????? r file??????? 在指定位置插入指定文件中的所有內容
?????? ?查找:
????????????? ?/pattern? 從光標處向文件尾部查找
????????????? ??pattern?????? ?從光標處向文件首部查找
????????????? ?n:???????? ?與命令同方向,下一個
????????????? ?N:??????? ?與命令反方向,上一個
????????????? ?
?????? ?查找并替換:
????????????? ?s????? 在擴展模式下完成查找替換操作
???????????????????? 格式:
??????????????????????????? 定界#.#s/要查找的內容/替換為的內容/修飾符
?????????????????????????????????? ?%s/haha/xixi/i
???????????????????? 要查找的內容:可以使用模式
???????????????????? ?替換為的內容:不能使用模式,但可以使用\1,\2,等后項引用符號
??????????????????????????? 還可以使用&引用前面查找時查找到的整個內容
??????????????????????????? 如:
??????????????????????????? ?????? 1,5s/haha/&ya/????
????????????????????????????????????????? ?將1-5行的haha替換成hahaya
?????????????????????????????????? ?%s/^\(UUID\)/#\1/? ?
????????????????????????????????????????? ?將UUID開頭的行加注釋,(替換成#UUID)
?????????????????????????????????? ?52s/\(feee\)/\1\1/
????????????????????????????????????????? ?將第52行的feee替換成feeefeee
???????????????????? 修飾符:
??????????????????????????? i:忽略大小寫
??????????????????????????? ?g:全局替換;默認情況下,每一行只替換第一次出現的匹配
??????????????????????????? ?gc:全局替換,每次替換前詢問
????????????????????
???????????????????? 查找替換中的分隔符/可替換為其他字符
??????????????????????????? 例如:
?????????????????????????????????? ?s@/etc@/etc/var@g
?????????????????????????????????? ?s#/boot#/root#i
練習4:
?????? ?1.復制/etc/profile至/tmp/目錄,用查找替換命令刪除/emp/profile文件中
?????? ?的行首的空白字符
????????????? ?:%s/^[[:space:]]\+//
?????? ?2.復制/etc/rc.d/init.d/functions文件至/tmp目錄,用查找替換命令為
?????? ?/tmp/functions的每行開頭為空白字符的行的行首添加一個#號
????????????? ?:%s/^\([[:space:]]\+\)/#\1/
????????????? ?
命令模式:撤銷更改
?????? ?u??????????? 撤銷最近的更改
?????? ?#u ??????? 撤銷之前多次更改
?????? ?U??????????? ?撤銷光標落在這行后所有此行的更改
?????? ?ctrl -r???? 重做最后一次的“撤銷”更改(取消撤銷)
?????? ?.???????????? 重復前一個操作
?????? ?n.?????????? 重復前一個操作n次
?????? ?
vim的寄存器:
?????? ?vim有26個命名寄存器和1個無名寄存器,常存放不同的剪貼板內容,可以不同
?????? ?會話間共享
????????????? ?(需要復制之后關掉會話然后在另外一個會話使用p,或者復制之后重新打開新會話復制。可能。。。)
?????? ?寄存器名稱a,b,c...z,
????????????? ?格式:
???????????????????? "寄存器名 ??? 放在數字和命令之間
????????????? ?如:
???????????????????? 3"tyy?????? 表示復制3行到t寄存器中
???????????????????? "tp????????? 表示將t寄存器的內容粘貼
?????? ?
?????? ?未指定,將使用無命名寄存器
?????? ?有10個數字寄存器,用0,1,2,..,9表示,0存放最近刪除內容。1存放最近刪除內容,
?????? ?當新的文本變更和刪除時,1轉存到2,2轉存到3,以此類推,數字寄存器不能在
?????? ?不同會話間共享
?????? ?
?????? ?編輯二進制文件:
????????????? ?以二進制方式打開文件:
???????????????????? vim -b ?binaryfile
????????????? ?擴展命令模式下,利用xxd轉換為可讀的十六進制
???????????????????? :%!xxd
????????????? ?編輯二進制文件
????????????? ?擴展命令模式下,利用xxd命令轉換回二進制
???????????????????? :%!xxd ?-r
????????????? ?保存退出
?????? ?
可視化模式:
?????? ?允許選擇的文本塊:
????????????? ?v??????????? 面向字符
????????????? ?大V??????? ?面向行
????????????? ?ctrl+v ??? 面向塊
?????? ?可視化鍵可用于與移動鍵結合使用:
????????????? ?w )}???? ?箭頭等
?????? ?突出顯示的文字可被刪除,復制,變更,過濾,搜索,替換等
?????? ?
多文件模式:
?????? ?vim file1 file2 file3.。。
????????????? ?:next?????????? ?下一個
????????????? ?:prev?????????? ?前一個
????????????? ?:first??????????? ?第一個
????????????? ?:last???????????? ?最后一個
????????????? ?:wall??????????? ?保存所有
????????????? ?:qall??????????? ?退出所有
????????????? ?:wqall????????? ?保存退出所有
????????????? ?
使用多個“窗口”:
?????? ?多文件分隔
????????????? ?vim -o |-O file1 file2
???????????????????? -o?? 水平分割
???????????????????? -O 垂直分割
????????????? ?在窗口間切換:ctrl+w,箭頭
?????? ?
?????? ?單個文件窗口分割:
????????????? ?ctrl+w,s????????? 水平分割
????????????? ?ctrl+w,v???????? 垂直分割
????????????? ?ctrl+w,q???????? 取消相鄰窗口
????????????? ?ctrl+w,o???????? 取消全部窗口
????????????? ?:wqall???????????????? 存退
????????????? ?
定制vim的工作特性:
?????? ?配置文件:永久有效
????????????? ?全局:/etc/vimrc
????????????? ?個人:~/.vimrc
?????? ?擴展模式:當前vim進程有效
?????? ?(1)行號
????????????? ?顯示:set number,簡寫為set ?nu
????????????? ?取消顯示:set nonumber,簡寫為set ?nonu
?????? ?(2)忽略字符的大小寫
????????????? ?啟用:set ic
????????????? ?不忽略:set noic
?????? ?(3)自動縮進
????????????? ?啟用:set ai
????????????? ?禁用:set noai
?????? ?(4)智能縮進
????????????? ?啟用:set smartdent,簡寫set ?si
????????????? ?禁用:set nosi
?????? ?(5)高亮搜索
????????????? ?啟用:set hlsearch
????????????? ?禁用:set nohlsearch
?????? ?(6)語法高亮
????????????? ?啟用:syntax on
????????????? ?禁用:syntax off
?????? ?(7)顯示tap 和換行符 ^I 和$顯示
????????????? ?啟用:set list
????????????? ?禁用:set nolist
?????? ?(8)文件格式
????????????? ?啟用windows格式 set ?fileformat=dos
????????????? ?啟用unit格式:?? set fileformat=unix
????????????? ?簡寫:set ff=dos|unix
?????? ?(9)設置文本寬度
????????????? ?啟用:set textwidth=65(vim ?only)
????????????? ?禁用:set wrapmargin=15
?????? ?(10)設置光標所在行的標識線
????????????? ?啟用:set cursorline,簡寫cul
????????????? ?禁用:set no cursorline
?????? ?(11)復制保留格式
????????????? ?啟用:set paste
????????????? ?禁用:set nopaste
?
了解更多:
?????? ?set幫助
????????????? ?:help option-list
????????????? ?:set or set all
?????? ?vim內置幫助
?????? ?vimturor 練習文件
?????? ?
?????? ?
練習5:
?????? ?1.在vim中設置tap縮進為4個字符
????????????? ?
?????? ?2.復制/etc/rc.d/init.d/functions文件至/tmp目錄,替換/tmp/functions
?????? ?文件中的/etc/sysconfig/init為/var/log
????????????? ?:%s@/etc/sysconfig/init@/var/log@
?????? ?3.刪除/tmp/functions文件中所有以#開頭,且#后面至少有一個空白字符的行
?????? ?的行首的#號
????????????? ?:%s@^#\([[:space:]]\+\)@\1@
?????? ?
?
?
筆記整理完成時間:2018年4月10日18:57:14
?????? ?
?????? ?
?????? ?
?????? ?
?????? ?
?
轉載于:https://blog.51cto.com/13683480/2097209
總結
以上是生活随笔為你收集整理的第六章,文本处理工具和正则表达式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从宝马与京东携手,透视汽车后市场变革
- 下一篇: 基于以太坊的去中心化宠物商店构建教程