文件處理
1.處理方式
匹配
正則表達式
egrep
awk
sed
2.文件中的處理字符
\n 新行符 換行
\t 制表符 tab鍵 缺省8個空格
\b 退格符 backspace鍵 退格鍵
\v 豎直制表符
\r 替代符 liu\rs =siu liu\rqwer =qwer 后面的替代依次前面的
3.字符處理
linux中的配置文件都是文本文件,為了批量任務、自動任務、選擇性的任務等,需要對文本文件進行結果篩選、結果更改等操作,這就需要對這些文件進行處理。
經常用於處理文本文件的命令有: head tail less cat wc sort cut等。Linux系統中處理文本內容強大的工具是結合正則表達式的命令grep(egrep)、awk、sed
4.常用命令
1.head、tail命令
head -n 3 f1 ---顯示文檔的前3行
head -n -3 f1 ---不顯示文檔的最后3行
tail -n 3 f1 ---顯示文檔的最后3行
tail -n +3 f1 ---從第3行開始,顯示到文檔結尾
tail -n +3 f1 | head -n 3
2.wc統計命令
wc -l f1 統計文檔中的行數
wc -c 統計字符數
wc -w 統計單詞數
wc --help 查看幫助
ll /etc/ | grep "^d" | wc -l ---統計/etc/下的目錄數
3.sort命令
對指定的文本文件的內容排序,排序的結果輸出到屏幕上,默認的字段分隔是空格或制表符。對源文件沒有影響。
格式:
sort [參數] [文件名1 文件命2 ...... 文件名N]
sort -nr -k 2 f2 ---排序顯示文檔中內容 -n 按數字大小排序 -r 按降序顯示,默認升序 -k 指定按照第幾列排序
sort -t ":" -nr -k 2 f2 --- -t 指定列的分割符,不寫默認以空格分隔
sort -nru -k 2 f2 --- -u表示去除重復行
4.cut命令
按列截取
cut -d " " -f 2 f2 ---截取顯示文檔的第二列,-d 指定分隔字符 -f 指定顯示第幾列
-b, --bytes=LIST
輸出這些字節
-c, --characters=LIST
輸出 這些 字符
使用man查看
5.grep命令
命令格式和作用
grep命令:將和指定的模式匹配的行顯示出來。
grep [選項] 模式 [文件名...]
grep命令將文件中的每一行和“模式”匹配,有和“模式”定義的內容先符合的行,
其匹配的結果為“真”這一行選中,顯示在屏幕上。
“模式”可以有多種形式,可以是具體字符,也可以是正則表達式。
egrep [選項] 模式 [文件名...] --正則表達式擴充功能
grep -E [選項] 模式 [文件名...] --正則表達式擴充功能
grep "name" f1 ---篩選包含"name"的行
grep "^name" f1 ---篩選以"name"開頭的行
grep "name$" f1 ---篩選以"name"結尾的行
grep "^name$" f1 ---篩選只有"name"的行
grep "^$" f1 ---篩選空行
ll /etc/ | grep "^d" ---篩選顯示/etc/下所有目錄,注:ll后第一個字符為d的表示目錄
grep -i "name" f1 --- -i 表示忽略大小寫
grep -v "name" f1 --- -v 表示顯示不包含指定字符的行
grep -n "name" f1 --- -n 表示篩選結果顯示所在的行號
grep "^name.*name$" f1 ---表示篩選以name開頭以name結尾的行
5.正則表達式
1.概念
正則表達式(命令中的PATTERN都可以使用)是使用 具體的字符+特殊字符 組成的組合來匹配文本中出現的內容。這個組合就是正則表達式。這些特殊字符稱為元字符,他們是描述字符的字符。
2.正則表達式的元字符
^ 表示匹配開頭,但如果出現在[](參見后續內容)中,表示對集合的內容取反
$ 表示匹配結尾
* 是占位符,表示其前的表達式沒有出現或任意多次重復(包括數字、符號等),優先級別最高 ab*c-> ac abc abbc abbbc \(ab\)*c->c abc ababc abababc
+ 是占位符,表示其前的表達式出現一次或任意多次重復(包括數字、符號等),優先級別最高
? 是占位符,表示其前的表達式沒有出現或出現一次(包括數字、符號等),優先級別最高
. 是占位符,僅表示一個字符(包括數字、符號等)
[ ] 表示集合中的一個元素,如[abcd]匹配a b c d中的任何一個字符,但[^abcd]表示匹配除a b c d四個字符之外集合(包括的范圍很廣)
( ) 括號中的內容組成分組
{ } 是重復標記,標識該符號(大括號或花括號)之前的字符重復出現了多少次。括號內部用2個數字表示范圍{3,7}表示之前的字符出現3~7次.但Linux中的grep命令僅支持正則表達式中的元字符,要支持[] () {} ?等,要用擴展正則表達式支持功能,即使用-E 參數或使用egrep命令,另外grep命令系列(包括egrep、fgrep)也不支持{}中范圍的表示方法,這時后面的}可用轉意字符表示,[1-9]{2,3\}
ab{3}c -> abbbc ab{2,4}c -> abbc abbbc abbbbc ab{2,}c ->abbc abbbc abb...bc a{,2}c ->ac abc abbc
\ 轉義字符
\b 匹配字符串的邊界(即頭尾)位置,即開頭和結尾,但由於\在linix中有特殊含義,所以使用時要用\\b表示,如\\b[a-f],表示匹配以a b c d e f字母開頭的字符串。而 [a-f]\\b 表示以a b c d e f字母結尾的字符串。
\B 匹配排除字符串邊界的位置,但由於\在linix中有特殊含義,所以使用時要用\\B表示,如\\B[a-f]表示匹配a b c d e f字母不在開頭位置的字符串。但這種情況要注意像aabc bdef也可以匹配上,這種匹配實際是匹配的aabc中的第二個a,將第一個a當作其他字符。
"" - , . @字符串分隔符
| 表示二選一,它的優先級最低 也作用於表達式:表達式1 | 表達式2
~ 用於兩個表達式匹配。
!~ 取反,即不匹配
3.案例 解釋
^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)* @ [a-zA-Z0-9-]+\.([a-zA-Z]{2,3})$ 匹配有效的郵件地址
4.解釋:
1 ^ //匹配開始位置
2 [_a-zA-Z0-9-] //定義了集合,匹配集合中的一個元素,即_ - 0-9 a-z A-Z中的任意一個
3 + //匹配前面的字符出現1次或多次(排除0次)
4 ( //定義分組開始
5 \. //只匹配 . 符號,因為 . 在正則表達式中有特殊含義,用轉義字符處理
6 [_a-zA-Z0-9-] // 集合
7 + //
8 ) //分組結束。組定義了匹配一個.和一個或多個字符數字組成的組,如 .163 .com .net .cn等都能匹配上
9 * //匹配之前的分組出現0次或多次。從開始到此處,定義了匹配郵箱名的匹配,可以匹配諸如:abc a_123 123-b asd123.qwe 1_abc.asd.kb2 等名字
10 @ //匹配 @ 符號
11 [a-zA-Z0-9-] //集合
12 + //匹配前面的字符出現1次或多次(排除0次)
13 \. //只匹配 .
14 ( // 分組2
15 [a-zA-Z] // 集合
16 {2,3\} //集合中的元素出現2到3次
17 ) // 分組2結束
18 $ //匹配結束位置。
4.正則表達式還支持POSIX字符集
[[:digit:]] --使用POSIX字符集
[:alnum:] 字母數字集合 [0-9a-zA-Z]
[:alpha:] 字母集合
[:blank:] 空格和制表符
[:cntrl:] 控制字符
[:digit:] 數字[0-9]
[:graph:] 可視和可顯示的字符(空格可顯示但不可見)
[:lower:] 小寫字符
[:upper:] 大寫字符
[:print:] 可顯示字符(非控制字符)
[:punct:] 標點符號
[:space:] 空字符 (空格、制表符、跳行)
[:xdigit:] 十六進制字符
POSIX非標准類:[:ascii:],非標准在很多命令中不支持,如:awk sed
5.正則表達式不能獨立運行
Linux系統中,對正則表達式的支持體現在命令中。命令的選項參數中包含“PATTERN”字樣的,就支持正則表達式,其中的PATTERN就是正則表達式的表示,這樣的命令很多,著名的有grep awk和sed。使用正則表達式,可以增強這些命令的匹配能力。
6.正則表達式練習:
1、mydir目錄下,有很多文件,顯示其中大小排在第三到第五的文件。(按從大小排列和從小到大排列)
ls -l | grep -v total* | sort -nr -k 5 | tail -n +3 | head -n +3從大到小
ls -l | grep -v total* | sort -n -k 5 | tail -n +3 | head -n +3從小到到
2、文件customer保存的是用戶的手機號和用戶號,其中,手機號使用xxx-xxx-xxxx形式保存,找出用戶手機號不規范的用戶行。
egrep -v \(\([0-9]{3}\)-\([0-9]{3}\)-\([0-9]{4}\)\)$ customer
3、文件customer保存的用戶的手機號、用戶名和地址。其中,個字段的分割是空格,找住在北京建國路姓李名字中有林的用戶行。
egrep ^李\(*林*\) customer | egrep \(*北京建國路*\)$
7.awk命令:
awk是一種解釋程序,因此,會按從左到右對各項解釋執行。
awk將文件的每一行視作一條記錄,對每條記錄以“模式”做匹配,匹配結果為"真",實施“動作”。
動作是linux的命令,可以由一條命令組成,也可以多條命令。
多條命令時,多個命令在一行中,命令之間用";"隔開,多個命令也可以在多行,每行一條命令,在這種情況下,為避免將多行的命令認作是和awk命令平級的命令,所以,模式動作對用''引起來。
awk中的"模式"可以省略。這種情況表示對文件的每一條記錄都實施動作。意為每一條的記錄匹配結果都為“真”。
awk中的動作也可以省略。這種情況下表示對匹配模式為“真”的記錄輸出到屏幕上。
awk中“模式”和“動作”二者必須有一個,不能全省略。也就是''中必有內容。
(1)格式:
awk [選項] ‘[模式] [{動作}]’ 文件1 文件2 ...... 文件N
(2)參數變量
$ + 數字 :表示第幾個字段,$1 ,$2 表示第 1 ,2 個字段,
NF :表示當前行有多少個字段,因此$NF就代表最后一個字段,$(NF-1)代表倒數第二個字段。
NR 表示當前處理的是第幾行
FILENAME:當前文件名
FS:字段分隔符,默認是空格和制表符。
RS:行分隔符,用於分割每一行,默認是換行符。
OFS:輸出字段的分隔符,用於打印時分隔字段,默認為空格。
ORS:輸出記錄的分隔符,用於打印時分隔記錄,默認為換行符。
OFMT:數字輸出的格式,默認為%.6g。
(3)例:
省略“模式”:
awk '{print "test messages"}' ref1
省略"動作":
awk '/name/' ref1
awk的"模式"種類繁多,可以使用Linux的條件判斷,也可以使用正則表達式,使用正則表達式要使用 /正則表達式/ 的方式。
awk的"動作"可以有多個:
{動作1}{動作2}{.......}{動作N}
多個動作相當於針對每一條記錄執行多個動作。這時"模式"匹配上的記錄只實施第一個動作語句。
第二個動作及之后的動作對所有的記錄都作用。這種方式和下述方式相同:
awk [選項] ‘模式 {動作}
{動作2}
......
{動作N}' ref1
若想為多個動作增加模式選擇,使用
'模式1 {動作1};模式2 {動作2};......;模式N{動作N}' ref1各模式動作組之間用“;”號分開。
awk的"模式""動作"對也可以存放在文件中,awk使用-f選項指定從該文件去解釋執行的內容:
awk [選項] -f awk_program ref1
awk_program文件中保存着"模式""動作"對。
如:
/name/ {print "awk_program"}
(4)awk處理文件:
awk命令的輸入來自指定的文件,也可以是鍵盤的輸入(標准輸入)或其他命令的輸出(使用管道)。
如果定義多個文件,awk會依次讀入、處理每個文件。當前正在處理的文件名,會保存在預定義好的保留變量FILENAME中。
awk會把文件的每一行作為一條記錄,依次讀入每條記錄,即讀入每一行。
awk會把已讀入的記錄的數量記錄在變量FNR中,有多個文件讀入時,FNR在每次讀入新文件時清零。
另一個變量NR則不清零,NR變量在awk執行時初始為0:
awk '{print FNR " " NR " " FILENAME}' rf1 rf2
文件中記錄的分隔是有預定義的變量RS的內容指定,缺省是\n。改變RS的值,就改變了記錄的分隔。分隔符不出現在輸出的內容中,除非特意指定輸出它。
5.案例:
ref1的內容如下:
abcd@123.com
qwe.poe@qaz.cn
asdasd_qwq@190.org這是郵件的地址形式
使用下列命令:
awk '{print}' rf1
awk '{RS="@"}{print}' rf1
print命令是將讀入的內容輸出到屏幕。在第一條awk命令將ref1的內容原樣顯示在屏幕上。
第二條命令中,ref1的第一行原樣顯示,之后的行按新的方式顯示。這是因為awk命令首先讀入記錄,然后按"模式"匹配,匹配結果為"真",記錄保留,再實施之后的"動作"。
由於初次讀入記錄時,記錄分隔符仍然是缺省值,即\n,所以第一行沒有變化。但實施"動作"后,由於動作中有修改RS的命令,所以,讀入第二條記錄及以后的記錄,就會按指定的分隔符操作。
驗證上述結論可以采用將第一行置空行的方式就可以看到所有的內容都遵循了記錄分隔符修改后的結果。
解決上述示例中修改記錄分隔符對第一行不起作用的問題,可以采用在文件讀入之前先行執行變量修改的方式,
即采用在命令行上改變變量的方式來修改記錄分隔符:
awk '{print}' ref1 RS="@" ref2
這種方式的設置表示在處理ref2文件前,修改記錄分隔符,結果ref2文件的記錄分隔符改為“@”,ref1仍然是原來的缺省值,沒有改變。
文件記錄字段:
awk在讀入記錄時,會將每一條記錄分成小段,稱為字段。字段的分隔缺省是空白字符(空格、制表符)。
字段分割開后,awk用數字變量的方式來表示第幾個字段,如1代表第一個字段;引用字段的內容,用變量加前綴$的方式表示,
$1表示第一個字段的內容,$127表示第127字段內容,不同於shell中的位置變量,數字不用用()括起來。$0表示整個記錄的內容。
awk用預定義變量NF保存當前正在處理的記錄總的字段數。awk每讀一個新的紀錄就會更新NF。記錄中的最后一個字段可用$NF表示。
awk中,所有前綴是$的表達式都是表示字段值,如果表達式的結果不是數值,轉成數值也要表示字段值。
awk中輸入記錄的字段的分隔符是由變量FS保存的內容指定,缺省是空白字符。輸出字段的分隔符由OFS變量指定,輸出的內容由輸出命令及其格式產生,前述內容中的print命令就是輸出命令,
這些命令包括諸如:print printf echo等命令。還包括條件判斷等關鍵字。
修改字段分隔符可以采用上述修改記錄分隔符的方式,也可以使用awk的選項-F指定輸入
6.分隔符
ENVIRON 支持隊列中系統環境變量的使用
FILENAME awk瀏覽的文件名
FNR 瀏覽文件的記錄數
FS 設置輸入域分隔符,等價於命令行 -F選項
NF 瀏覽記錄的域的個數
NR 已讀的記錄數
OFS 輸出域分隔符
ORS 輸出記錄分隔符
RS 控制記錄分隔符
$0變量是指整條記錄。$1表示當前行的第一個域,$2表示當前行的第二個域,......以此類推。
1
$NF是number finally,表示最后一列的信息,跟變量NF是有區別的,變量NF統計的是每行列的總數
/ / 表示正則表達式
vi交互式處理 s 替換
sed非交互式文件內容編輯器
7.awk案例
awk '{FS="@";print $0,$2}' ref1
awk '{print $0,"--",$1}' FS="@" ref1
awk -F":" '{print $0,"---",$2}' ref1
awk -F " " '{print $2,$3}' f2 ---截取顯示第二列,-F 指定分隔符 $后跟要顯示的列號
awk -F " " '($2>300) {print $2,$3}' f2 --- ()中增加篩選條件
awk -F " " '(NR==3)' f1 --- NR表示行號
awk -F " " '(NR>=3 && NR<=5) {print $2}' f2
awk -F " " '(NR==3 || NR==5)' f1
awk '/name/ {print $2,$3}' f2 ---/字符/ 表示篩選指定字符的行
awk '$4 ~ /name/' f1 ---篩選第四列中包含指定字符的行
awk '$4 !~ /name/' f1 ---篩選第四列中不包含指定字符的行
awk -F ":" '($3>=1000) {print $1,$3,$6,$7} ' /etc/passwd ---顯示所有的自定義用戶
8.sed:
數據流編輯命令
sed全稱stream Editor流編輯器。實現對輸入數據流(文本文件輸入或管道輸入)內容的基本文本內容轉換,便於使用shell程序實現自動維護,自動實施以及批量處理等任務。
sed的工作方式是只對輸入進行一次轉換。輸入內容不受影響,輸出內容轉換為指定的內容。
sed命令格式:
sed [選項] {執行腳本} [輸入文件名]
ed命令中的輸入文件名可以缺失,如沒有輸入文件名,或輸入文件名是"-",sed從鍵盤(標准輸入)讀入內容。
sed輸出內容到屏幕(標准輸出),使用輸出重定向可以輸出到文件。以下命令是相同的:
sed 's/hello/welcome/' input.txt > output.txt
sed 's/hello/welcome/' < input.txt > output.txt
cat input.txt | sed 's/hello/welcome/’ - > output.txt
s替換inout.txt中hellow為welcome 並保存在output.txt
sed 's/hello/welcome/g' input.txt > output.txt -g是將文件所有hello改為welcome
sed的腳本格式如下:
地址/模式/動作X
模式是匹配模式。
動作是執行的命令,一般只用單字符表示。若模式缺失,動作在所有行上實施。
sed的命令如下:
p 顯示匹配的內容
d 刪除匹配的內容
i 指定行之前插入內容
a 指定行之后插入內容
s/word1/word2/[g] 替換內容
sed動作中可以前綴地址,表示針對指定的地址執行動作:
sed 1,3d input.txt --刪除第一行到第三行
但地址指定時,要小地址在前,大地址在后。大地址在前時,只能針對大地址操作,不能表示范圍
sed 4,2d input.txt --只刪除第四行
指定地址時,有幾種表示方式
2,+3 從第二行開始,再增加3行
sed -n 2,+3p input.txt
2,3! 除第二行到第三行的其它行
sed -n 2,+3\!p input.txt
2~3 從第二行開始,跳過3行。
sed -n 1~2p input.txt
sed命令缺省會顯示所有的行,如若不想顯示所有的行,使用-n選項。
對於多次的"模式""動作"對,使用-e選項。
sed -e /模式1/動作1/ -e /模式2/動作2/ ...... 文件名
sed -e 1,3p -e 2,4d input.txt ----1,3顯示,2,4刪除
sed字符處理
---不顯示第3-5行
sed '3,$d' f1 ---不顯示第3行到結尾
sed '/name/d' f1 ---不顯示包含指定字符的行
sed 's/name/hello/p' f1 ---字符替換
sed 's/name/&abc/g' f1 ---查到到指定字符后,在字符后追加內容
sed -n '/name/p' f1 ---篩選顯示包含指定字符的行
tar -c 產生包文件 -f abc.tar
一、打包命令
tar -cvf back.tar f1 f2 f3 ---多文件打包,-c 創建包文件 -v查錯 -f 文件名顯示進度
tar -tf back.tar ---查看包文件的內容
tar -xvf back.tar ---在當前目錄下解包,注:若目錄下已有同名文件,則直接覆蓋
tar -xvf back.tar -C /mnt/dd --- -C 指定解包路徑,即解包到指定目錄下
tar -uf back.tar f4 ---追加文件
tar -f back.tar --delete f1 ---刪除包中的指定文件
tar-f backup.tar --get test2.txttestc.txt ---提取文件
tar -Af back1.tar back2.tar ---把第二個包中的文件,追加到第一個包中,即合並
tar -cvf back.tar f1 f2 f3 --remove-files ---打包后刪除源文件
注:文件后綴,僅起到文件類型的標識、識別功能,不能決定文件內部的存儲格式
建議創建文件時,增加文件后綴,為了便於長期的文件識別、管理
9.壓縮,解壓命令 gzip bzip tar
gzip back.tar ---壓縮后增加后綴 .gz
gunzip back.tar.gz ---解壓縮
bzip back.tar ---bzip壓縮,后綴為.bz
bunzip back.tar.bz ---解壓縮
compress f1 ---壓縮,壓縮后后綴為.z
uncompress f1.z ---解壓縮
注:部分centos版本系統安裝后默認不支持bzip、compress功能,若要使用,需要手動安裝
tar -zcvf back.tgz f1 f2 f3 ---打包壓縮一步完成, .tgz=.tar.gz
tar -zxvf back.tar.gz ---解壓解包,可加 -C 指定解包路徑
12系統、核心數據備份
1、制作備份光盤鏡像
genisoimage -J -L -r -o /mnt/etc.iso /etc ---給/etc/制作鏡像文件
-J 備份符合Joliet命名規范的文件或目錄 -L 備份隱藏文件 -r 允許讀取目錄下所有文件 -o 指定生成的鏡像文件名
mount /mnt/etc.iso /mnt/d1 ---把鏡像當做光盤直接掛載使用
注:老版linux,mount /mnt/etc.iso /mnt/d1 -o loop --- -o loop 表示偽設備掛載
wodim --devices ---查看本機的刻錄設備,如:查到設備名為 /dev/dvdrw
wodim -v dev=/dev/dvdrw blank=fast ---清空光盤上原數據
wodim -v dev=/dev/dvdrw /mnt/etc.iso ---刻錄鏡像文件入光盤
2、dd數據導入導出
dd if=源設備、文件 of=目標設備、文件 bs=每次大小 count=導入次數
dd if=f1 of=f2 ---文件復制
dd if=f1 of=f2 bs=3 count=2 ---導入數據兩次,每次3B
dd if=/dev/sda2 of=/mnt/f1 bs=4096 count=50 ---備份某分區的前50個block
dd if=/dev/sda2 of=/dev/sdb3 ---分區數據拷貝
dd if=/dev/sda of=/dev/sdb ---磁盤數據對拷,相當於制作母盤
dd if=/dev/zero of=/mnt/f1 bs=100M count=5 ---創建500M大小的文件
--- /dev/zero 偽設備,功能:無限生成二進制的0
dd if=/dev/zero of=/dev/sda3 bs=100M count=3 --- 擦除分區
3、Linux系統備份方案
使用dd 制作母盤,備份整個Linux磁盤
使用ghost工具,給系統磁盤,如sda做磁盤鏡像 .gho
核心系統文件,使用genisoimage做鏡像
應用軟件、服務的數據,一般使用專用軟件做數據備份
4、數據備份基本概念
備份分類
完全備份 ---備份所有數據
差異備份 ---備份和上一次完全備之間的變化數據
增量備份 ---備份和上一次備份操作之間的變化數據
累積增量備份 ---備份多次備份操作的變化總和
備份級別
0-9級,共10級
0級 ---完全備
1級 ---備份和0級之間的變化
2-9 ---備和上一級,或者最近一次數字小的級別之間的變化數據
備份策略
周日晚 0級備 完全備
周一晚 2級備 差異備
周二晚 2級備 差異備
周三晚 1級備 差異備
周四晚 2級備 增量備
周五晚 2級備 累積增量備
周六晚 2級備 累積增量備
5、數據備份實驗 創建分區
dump數據備份,特點:僅可以給某分區做備份,不支持文件夾、文件的備份
配置思路:新建一個分區,制作文件系統,但不掛載使用,專用於數據備份,
備份時,指定的源分區是指定的其掛載點
yum -y install dump ---安裝dump軟件包
fdisk /dev/sda6 ---創建新分區 /dev/sda6 800M
partprobe
mkfs -t ext4 /dev/sda6 ---制作文件系統,注:不掛載使用
cd /home
touch f1 f2 f3
mkdir dd
touch dd/f4 dd/f5
dump -0 -u -f /dev/sda6 /home ---備份分區,注:一定指定的是分區的掛載點-0 指定備份級別
-u 記錄備份日志,日志文件 /etc/dumpdates -f 指定用於備份的分區設備 后面指定文件系統掛載點,如:/home
dump -W ---查看備份日志
restore -tf /dev/sda6 ---查看備份設備中的文件
restore -rf /dev/sda6 ---把備份設備中的所有文件恢復到當前目錄下
restore -xf /dev/sda6 f2 dd/f4 ---恢復指定文件,按提示:點 1 點 y 即可