1. 程式人生 > >文字處理及正則表示式

文字處理及正則表示式

文字處理及正則表示式

檔案檢視

檔案檢視命令:
cat,tac,rev
cat [OPTION]… [FILE]…

cat
-E:顯示行結束符$  
-n:對顯示出的每一行進行編號  
-A:顯示所有控制符  
-b:非空行編號  
-s:壓縮連續的空行成一行  

tac 與cat相反
rev
檔案檢視
more: 分頁檢視檔案

more [OPTIONS...] FILE...  
-d: 顯示翻頁及退出提示  
less:一頁一頁地檢視檔案或STDIN輸出  

檢視時有用的命令包括:
/文字搜尋文字
n/N跳到下一個或上一個匹配
less命令是man命令使用的分頁器

顯示文字前或後行內容*******************************(重點)

head [OPTION]… [FILE]…

head
-c #: 指定獲取前#位元組  
-n #: 指定獲取前#行  
-#:指定行數  
tail [OPTION]... [FILE]...  
-c #: 指定獲取後#位元組  
-n #: 指定獲取後#行  
-#:同上  
-f: 跟蹤顯示檔案fd新追加的內容,常用日誌監控  
相當於--follow=descriptor  
-F: 跟蹤檔名,相當於--follow=name --retry  
tailf類似tail –f,當檔案不增長時並不訪問檔案  

按列抽取文字cut和合並檔案paste*********************CUT

cut [OPTION]… [FILE]…

cut
-d DELIMITER: 指明分隔符,預設tab  
-f FILEDS:  
#: 第#個欄位  
#,#[,#]:離散的多個欄位,例如1,3,6  
#-#:連續的多個欄位, 例如1-6  

混合使用:1-3,7
-c按字元切割
–output-delimiter=STRING指定輸出分隔符
cut和paste
顯示檔案或STDIN資料的指定列

cut -d:-f1 /etc/passwd  
cat /etc/passwd|cut -d: -f7  
cut
-c2-5/usr/share/dict/words

paste 合併兩個檔案同行號的列到一行

paste [OPTION]... [FILE]...  
-d 分隔符:指定分隔符,預設用TAB  
-s : 所有行合成一行顯示  
示例:  
paste f1 f2  
paste -s f1 f2

收集文字統計資料wc*****************************************WC

計數單詞總數、行總數、位元組總數和字元總數
可以對檔案或STDIN中的資料執行
wcstory.txt
392371901story.txt
行數字數字節數
常用選項

wc
-l    只計數行數  
-w    只計數單詞總數  
-c    只計數字節總數  
-m    只計數字符總數  
-L    顯示檔案中最長行的長度  

文字排序sort

把整理過的文字顯示在STDOUT,不改變原始檔案
sort[options]file(s)
常用選項

sort
-r執行反方向(由上至下)整理
-R隨機排序  
-n執行按數字大小整理  
-f選項忽略(fold)字串中的字元大小寫  
-u選項(獨特,unique)刪除輸出中的重複行  
-t c選項使用c做為欄位界定符  
-k X選項按照使用c字元分隔的X列來整理能夠使用多次  

uniq

uniq命令:從輸入中刪除前後相接的重複的行
uniq[OPTION]… [FILE]…

uniq
-c: 顯示每行重複出現的次數  
-d: 僅顯示重複過的行  
-u: 僅顯示不曾重複的行  
注:連續且完全相同方為重複  
常和sort 命令一起配合使用:  
sort userlist.txt | uniq -c  

比較檔案

比較兩個檔案之間的區別

difffoo.conffoo2.conf  
5c5 
< use_widgets=no
>use_widgets=yes          #註明第5行有區別(改變)

取出IP地址的幾種方法**********(重點)

ifconfig | sed -r '2!d;s/.*inet (addr:)?//;s/ .*//'   #6和7通用的取出IP地址    
ifconfig eth0 | head -2|tail -1| tr -dc '[0-9]. ' |tr -s ' ' |cut -d" " -f2   #centos6系統上  
ifconfig eth0|sed -n '2p'|sed '[email protected]*inet @@'|sed '[email protected] netmask.[email protected]@' #提取出7上的IP地址,其中@@為分隔符  
ifconfig ens33|sed -nr '2s/.*t (.*) net.*/\1/gp' #擴充套件的正則表示式取出IP,()為分組,只有一個括號,所以後面寫1  
ifconfig ens33|sed -nr '2s/(.*t) (.*)( net.*)/\2/gp' #擴充套件的正則表示式取出IP,()為分組,有三個括號,所以後面寫2留第二個  
ifconfig | sed -nr "s/.inet (.*) netmask.*/\1/p" | head -n 1   #取出7的IP  
ifconfig | sed -nr "s/.inet (.*) netmask.*/\1/p" #取出7的三個網絡卡IP  

查詢系統資訊 *****************重點

#RED is content color  
RED="\033[1;31m"  
COLOREND="\033[0m"  
echo -e "OS version is $RED`cat /etc/centos-release`$COLOREND"  #顯示系統版本 
echo -e "kernel version $RED`uname -r`$COLOREND"    #顯示核心版本 
echo -e "The cpu type is $RED`lscpu |egrep -i 'model name'|tr -s ' '|cut -d: -f2`$COLOREND"        #顯示CPU型號 
echo -e "The memory is $RED`free -h|egrep Mem|tr -s ' ' ':' |cut -d: -f2`$COLOREND"           #取出記憶體大小  
echo -e "The max disk used is $RED`df |grep  /dev/sd|tr -s " " ":"|cut -d: -f5|sort -nr|head -1`$COLOREND"      #取出最大磁碟利用率
echo -e "The hostname is $RED$(hostname)$COLOREND"    #取出hostname 
echo -e "The ipaddr is $RED`ifconfig|head -2|tail -1|tr -s " " ":"|cut -d: -f3`$COLOREND"      #取出IP地址
unset RED COLOREND        #不使用顏色

Linux文字處理三劍客

grep:文字過濾(模式:pattern)工具
grep, egrep, fgrep(不支援正則表示式搜尋)
sed:stream editor,文字編輯工具
awk:Linux上的實現gawk,文字報告生成器

grep**************************************(重點)

grep: Global search REgularexpression 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命令選項

grep
--color=auto: 對匹配到的文字著色顯示  
-v: 顯示不被pattern匹配到的行  
-i: 忽略字元大小寫  
-n:顯示匹配的行號  
-c: 統計匹配的行數  
-o: 僅顯示匹配到的字串  
-q: 靜默模式,不輸出任何資訊  
-A #: after, 後#行  
-B #: before, 前#行  
-C #:context, 前後各#行  
-e:實現多個選項間的邏輯or關係  
grep –e ‘cat ’ -e ‘dog’ file  
-w:匹配整個單詞  
-E:使用ERE  
-F:相當於fgrep,不支援正則表示式  
-ffile: 根據模式檔案處理  

正則表示式*************************重點

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

基本正則表示式元字元

字元匹配:

. 匹配任意單個字元
[] 匹配指定範圍內的任意單個字元,示例:[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:] 標點符號

萬用字元是通配的檔名

正則表示式是配的字串,檔案的內容
【wang】 匹配這四個字元其中的一個

grep "[123]" /etc/passwd     #查詢passwd資料夾裡包含123中一個數字的檔案  
grep -v "[123]" /etc/passwd  #查詢passwd資料夾裡不包含123中一個數字的檔案  
grep "[^123]" /etc/passwd   #查詢passwd資料夾裡除了123中一個數字的檔案  

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

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

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

^ 行首錨定,用於模式的最左側 grep “^bash” /etc/passwd
$ 行尾錨定,用於模式的最右側 grep "bash &quot; / e t c / p a s s w d P A T T E R N &quot; /etc/passwd ^PATTERN 用於模式匹配整行
^$ 空行
1$ 空白行
< 或\b詞首錨定,用於單詞模式的左側(單詞不能包含數字、_、其他字母開頭)
> 或\b詞尾錨定,用於單詞模式的右側
<PATTERN>匹配整個單詞
**************************************************

正則表示式

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

\2 :string2
後向引用:引用前面的分組括號中的模式所匹配字元,而非模式本身
或者:|
示例:a|b: a或b C|cat: C或cat (C|c)at:Cat或cat
元字元

^ 行首
$行尾
.任意單一字元
[][]內任意單一字元
[^]除[]內任意單一字元
**前面字元重複不確定次數
++前面字元重複一次以上不確定次數
??前面字元重複0或1次
\轉義符
.*任意長度字元
{n}前面字元重複n次
{n,}前面字元重複n次以上
{m,n}前面字元重複m次和n次之間
[:alnum:]字母和數字
[:alpha:]代表任何英文大小寫字元,亦即A-Z, a-z
[:lower:]小寫字母
[:upper:]大寫字母
[:blank:]水平空白字元(空格和製表符)
[:space:]所有水平和垂直的空白字元(比[:blank:]包含的範圍廣)
[:cntrl:]不可列印的控制字元(退格、刪除、警鈴…)
[:digit:]十進位制數字
[:graph:]可列印的非空白字元
[:print:]可列印字元
[:punct:]標點符號
[:xdigit:]十六進位制數字

egrep及擴充套件的正則表示式

egrep= grep -E
egrep[OPTIONS] PATTERN [FILE…]
擴充套件正則表示式的元字元:
字元匹配:

. 任意單個字元
[] 指定範圍的字元
[^] 不在指定範圍的字元
次數匹配:
*匹配前面字元任意次
?0或1次
+1次或多次
{m}匹配m次
{m,n}至少m,至多n次
位置錨定:
^行首
$行尾
<, \b語首
>, \b語尾
分組:()
後向引用:\1, \2, …
或者:
a|ba或b
C|catC或cat
(C|c)atCat或cat

vim簡介*****************************重點

見PDF6中第32,68,69頁圖片
vi: Visual Interface,文字編輯器
文字:ASCII, Unicode
文字編輯種類:
行編輯器: sed
全屏編輯器:nano, vi
vim-Vi Improved

其他編輯器:
gedit一個簡單的圖形編輯器
gvim一個Vim編輯器的圖形版本

開啟檔案

vim [OPTION]... FILE...  
+#開啟檔案後,讓游標處於第#行的行首,+預設行尾  
+/PATTERN開啟檔案後,直接讓游標處於第一個被PATTERN匹配到的行的行首  
–b file 二進位制方式開啟檔案  
–d file1 file2… 比較多個檔案  
-m file 只讀開啟檔案  
ex file 或vim –e 直接進入ex模式  
如果該檔案存在,檔案被開啟並顯示內容  
如果該檔案不存在,當編輯後第一次存檔時建立它  
模式轉換  
命令模式--> 插入模式  
iinsert, 在游標所在處輸入  
I在當前游標所在行的行首輸入  
aappend, 在游標所在處後面輸入  
A在當前游標所在行的行尾輸入  
o在當前游標所在行的下方開啟一個新行  
O在當前游標所在行的上方開啟一個新行  

VIM模式的切換

插入模式--------> 命令模式
ESC
命令模式--------> 擴充套件命令模式
:
擴充套件命令模式--------> 命令模式
ESC,enter


擴充套件命令模式:

: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:向檔案首部翻半屏

命令模式操作**********************************************重點

刪除命令:  
d: 刪除命令,可結合游標跳轉字元,實現範圍刪除  
d`$`: 刪除到行尾  
d^:刪除到非空行首  
d0:刪除到行首  
dw:  
de:  
db:  
.#COMMAND  
dd: 刪除游標所在的行  
.#dd:多行刪除  
D:從當前游標位置一直刪除到行尾,等同於d$  
複製命令(y, yank):  
y: 複製,行為相似於d命令
y$  
y0  
y^  
ye  
yw  
yb  
.#COMMAND  
yy:複製行  
.#yy: 複製多行  
Y: 複製整行

命令模式

di" 游標在”“之間,則刪除”“之間的內容  
yi( 游標在()之間,則複製()之間的內容  
vi[ 游標在[]之間,則選中[]之間的內容  
dtx刪除字元直到遇見游標之後的第一個x 字元  
ytx複製字元直到遇見游標之後的第一個x 字元  
擴充套件命令模式:地址定界********************按ESC進入命令模式,再按:進入擴充套件命令模式  

###地址定界

:start_pos,end_pos
# 具體第#行,例如2表示第2行#,# 從左側#表示起始行,到右側#表示結尾行
#,+# 從左側#表示的起始行,加上右側#表示的行數 :2,+3 表示2到5行 . 當前行 . , ` 最後一行 .,` `-1 當前行到倒數第二行
% 全文, 相當於1,$
/pat1/,/pat2/
從第一次被pat1模式匹配到的行開始,一直到第一次被pat2匹配到的行結束
#,/pat/
/pat/,$
使用方式:後跟一個編輯命令
d
y
w file: 將範圍內的行另存至指定檔案中
r file:在指定位置插入指定檔案中的所有內容
/PATTERN:從當前游標所在處向檔案尾部查詢
?PATTERN:從當前游標所在處向檔案首部查詢
n:與命令同方向
N:與命令反方向


s: 在擴充套件模式下完成查詢替換操作******************重點

格式:s/要查詢的內容/替換為的內容/修飾符
要查詢的內容:可使用模式
替換為的內容:不能使用模式,但可以使用\1, \2, …等後向引用符號;還可以使用“&”引用前面查詢時查詢到的整個內容
修飾符:

s/要查詢的內容/替換為的內容/修飾符 
i: 忽略大小寫  
g: 全域性替換;預設情況下,每一行只替換第一次出現  
gc:全域性替換,每次替換前詢問  
查詢替換中的分隔符/可替換為其它字元,例如  
[email protected]/[email protected]/[email protected]  
s#/boot#/#i  

命令模式:撤消更改
u撤銷最近的更改
#u撤銷之前多次更改
U撤消游標落在這行後所有此行的更改
按Ctrl-r重做最後的“撤消”更改
. 重複前一個操作
n.重複前一個操作n次
多檔案模式

vim FILE1 FILE2 FILE3 ...  
:next 下一個  
:prev前一個  
:first 第一個  
:last 最後一個  
:wall 儲存所有  
:qall退出所有  
: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) 智慧縮排
啟用:smartindent簡寫set si
禁用:set nosi
(5) 高亮搜尋
啟用:set hlsearch
禁用:set nohlsearch
(6) 語法高亮
啟用:syntax on
禁用:syntax off
(7) 顯示Tab和換行符^I 和$顯示
啟用:set list
禁用:set nolist
(8) 檔案格式
啟用windows格式:set fileformat=dos
啟用unix格式:set fileformat=unix
簡寫:set ff=dos|unix
(9) 設定文字寬度
set textwidth=65 (vimonly)
set wrapmargin=15
(10) 設定游標所在行的標識線
啟用:set cursorline,簡寫cul
禁用:set no cursorline
(11) 複製保留格式
啟用:set paste
禁用:set nopaste



  1. [:space:] ↩︎