tags: Shell
Categories: Shell
第四章-讓文本飛
需要熟練的使用sed, awk, grep, cut可以較好的處理文本文件
使用正則表達(dá)式
1. 位置錨點(diǎn)
"^" : 表示匹配的文本榔至,必須起始于字符串的首部,eg: ^renf 能夠匹配renf開頭的行
“ 能夠匹配以dat結(jié)尾的行
2. 標(biāo)識(shí)符
. : 任意匹配
[] : 括號(hào)內(nèi)部的任意匹配蕴纳, 如renf[0-6].txt: 則匹配任意renf0.txt 到renf6.txt的文件
[^] : 表示非照筑, 如renf[^12], 出去renf1 與renf2的其他ren*文件。
3. 數(shù)量修飾符
以上的標(biāo)識(shí)符在一次表達(dá)中,出現(xiàn)一次或多次毫目,或不出現(xiàn)嘹朗。 可以用數(shù)量修飾符定義出現(xiàn)的次數(shù)
师妙? 匹配之前的項(xiàng)1次或0次, eg: colou?r能匹配color或者colour屹培,
- 匹配之前的項(xiàng)1次或多次
- 匹配之前的項(xiàng)0次或多次 col能夠匹配cl, col, coool
{n} 匹配之前的項(xiàng)n次 [0-9]{3}能任意匹配的三位數(shù)默穴, 相當(dāng)于:[0-9][0-9][0-9]
{n, } 之前的項(xiàng)至少匹配n次 [0-9]{2, } 能過(guò)匹配任意的一個(gè)兩位或者更多位的數(shù)字
{n, m} 之前的項(xiàng)必須*匹配的最小n次和最大m次 [0-9]{2,5}能匹配兩位到五位數(shù)之間的任意一個(gè)數(shù)字
4. 其他特殊
() 將括號(hào)中的內(nèi)容視為一個(gè)整體, eg: ma(tri)?x, 能匹配ma褪秀, 或matri
| 表示或 Oct (1 | 2) 能匹配Oct 1 或 Oct 2
\ 特殊字符需要加的轉(zhuǎn)義符號(hào)
5. grep
5.1 一般使用
grep convergence reml.out # 在reml.out中尋找含 convergence的行
grep conver file1 file2 # 可以在多個(gè)文件中搜索
5.2 當(dāng)然grep 一般和正則表達(dá)結(jié)合是非常厲害的
grep -E "[con]+" reml.ot
或者 egrep是默認(rèn)有正則表達(dá)式
egrep "[con]+" renm.out
5.3 其他參數(shù)
-o 只給出匹配的文本(不是行)
-v 顯示出不匹配的所有行(invert)
-c 顯示匹配的總的行數(shù)蓄诽, 這里統(tǒng)計(jì)的是行數(shù),而不是匹配的次數(shù)(有時(shí)一個(gè)行內(nèi)有多個(gè)匹配)
統(tǒng)計(jì)次數(shù):
egrep -o ''[con]" file | wc -l
-n 顯示匹配的所在行的行號(hào)媒吗, 也就可以加多個(gè)文件進(jìn)行
-b -o 顯示匹配所在行的字符偏移
-l 返回匹配的文件名列表仑氛, -L
目錄下文件搜索
grep "con" . -R -n #當(dāng)前目錄下搜索所有含con的目錄+文件+行, 包含子文件內(nèi)
-i 忽略大小寫闸英,
-e 多個(gè)匹配模式 eg: grep -e AIC -e BIC
-f 將其搜索的內(nèi)容寫在文件中锯岖,進(jìn)行讀取,使用
--include 指定文件搜索:
grep "main()" . r --include *.{c, cpp} #搜索所有的.c .cpp的文件
類似; --exclude 排除; 同時(shí)加 --exclude-dir 排除搜索目錄
-A 打印匹配行以后的結(jié)果甫何,n指定行數(shù)出吹, grep con -A 3 reml.out
-B 類似上述,但是打印以前的直接
-C 是打印之前和之后的共同輸出
以上三個(gè)參數(shù)沛豌,當(dāng)有多個(gè)匹配時(shí)趋箩, 會(huì)以--作為間隔
6 xargs
xargs 命令可以為其他命令提供命令行參數(shù)列表
當(dāng)文件名為命令行參數(shù)時(shí), 建議0值作為文件名結(jié)尾加派,不是空格叫确。
如: grep "test" file* -lZ | xargs -0 rm # 將含有test的file*文件刪除
-l 只輸出文件名, -Z grep使用0值字節(jié)(\0)作為文件名的終結(jié)符芍锦,兩者通常一起使用竹勉。 xargs -0 會(huì)告訴rm命令,使用0值作為輸入的分節(jié)符
cut
每一列被稱為一個(gè)字段
-f 選出需要有的字段娄琉, cut -f2,3 file # 選出file的第二和第三列
--complement 選出沒(méi)有-f指定的其他列次乓, cut -f2 --complement file #顯示除了第二列的其他所有列
-d 設(shè)置文件中的分割符號(hào)吓歇, cut -f2 -d";" file # 分隔符為;
指定字段的字符或字節(jié)范圍(提出本組的EBV數(shù)據(jù)票腰,可以用)城看,
N- 從第N個(gè)字節(jié)、字符或字段開始到結(jié)尾
N-M 從第N個(gè)字節(jié)杏慰、字符或字段開始到M結(jié)束(包括M)
-M 從第一個(gè)到第M個(gè)
-b 表示字節(jié)
-c 表示字符 ##我們常用
-f 用于定于字段
--output-delimiter 指定輸出的分隔符测柠,多組數(shù)據(jù)時(shí)使用。
eg cut range.txt -c1-3,6-9 --output-delimiter ","
sed替換文本
基本調(diào)用格式: sed 's/pattern/replace_string/' file
sed默認(rèn)只打印出被替換的文本
-i 會(huì)使用sed用修改的數(shù)據(jù)替換原始文件
g缘滥, 會(huì)使每行中多次匹配的文字被修改轰胁, sed ‘ s/test/replace_test/g’ file
/#g ,可以標(biāo)記替換第N次出現(xiàn)以后的匹配朝扼。 sed 's/test/rplace_test/2g' file 第二次匹配以后的全部被替換
sed默認(rèn)s以后的字符為分隔符赃阀, 如: sed 's,tesx,repalce,g' file 則表示, 為分隔符
去除空行: sed '/^匹配空行, /d 表示不是執(zhí)行替換擎颖,而是之間刪除匹配的空行
-i 直接就原文件中修改內(nèi)容 sed 's/test/replace_test/' -i filename
使用指定的數(shù)值替換文件中中所有3位數(shù)的數(shù)字
sed -i 's/\b[0-9]{3}\b/Replace_number/g' file
\b[0-9]{3}\b 匹配三位數(shù)榛斯, \b表示邊界
sed -i.bak 's/a/c/g' file 用c代替全部的a, 并且在原文件修改,但同時(shí)會(huì)生成file.bak原文件的副本
& 已匹配字符串符號(hào)
sed 's/\w+/[&]/g' file # \w\ +可以匹配任意的單詞搂捧, 將其加上[]的標(biāo)志
多個(gè)組合表達(dá)式肖抱,可以用 | 組合
cat file | sed 's/a/A/d' | sed 's/b/B/d'
引用
shell在調(diào)用其他命令時(shí),先會(huì)擴(kuò)展雙引號(hào)中的內(nèi)容异旧,
如 text=hello; echo hello world | sed "s/$text/Hello/g"
awk 高級(jí)文本處理
調(diào)用模式:
awk 'BEGIN{ print “start” } pattern { commands } END { pringt "end" } ' file
以上有三個(gè)結(jié)構(gòu)組成: BEGIN, END 和command , 在使用中可選提佣,不一定全部出現(xiàn)
其是按行處理文件吮蛹, 可放在單引號(hào)或雙引號(hào)中進(jìn)行分析
特殊變量:
NR: 當(dāng)前行號(hào)
NF: 字段數(shù)量
1: 第一列的內(nèi)容
(NF-1)表倒數(shù)第二列
-V 可以將外部值傳遞給awk
當(dāng)輸入的變量來(lái)自文件時(shí)拌屏,也可以: awk '{ print v1, v2 }' v1=var2 file
過(guò)濾模型:
awk 'NR < 5 ' # 行號(hào)小于5的行
awk 'NR ==1, NR==4' #行號(hào)1到5之間
awk '/linux/' #包含linux的行
awk '!/linux/' #不包括linux行
設(shè)置分割符號(hào)
-F awk -F: '{ print i ; }
替換
awk '{sub(/test/, "no", 2); print}' | awk '{ sub(/3/, "999", $3);print}' > new_renf90
壓縮或解壓縮JavaScript(了解即可)
JavaScript(其他語(yǔ)言類似)在寫作過(guò)程中倚喂,為了可讀性每篷,我們都會(huì)加入一些空格和注釋,但這些會(huì)增加代碼文件的體積端圈,拖慢網(wǎng)頁(yè)的加載速度焦读。為了加快,一般都會(huì)壓縮JavaScript舱权,會(huì)刪除空白符和換行符實(shí)現(xiàn)(稱為Minified JS)矗晃。當(dāng)然這個(gè)過(guò)程也可以反過(guò)來(lái),稱為解壓縮宴倍。shell中同樣可以實(shí)現(xiàn)類似的功能张症。
cat and paste
cat可以按行來(lái)合并多個(gè)文件
paste則可以按列合并多個(gè)文件仓技, eg paste file1 file2 -d "," #d 指定分割符號(hào)
tac以逆形式打印行
eg; seq 5 | tac
大批量替換
find . -name *.cpp -print0 | \ xargs -I { } -o sed -i 's/Copyright/Copeleft/g' { }
or
find . -name *.cpp -exec sed -i 's/Copyright/Copeleft/g' {} +
找到當(dāng)前目錄下的所有 .cpp文件俗他,并使用 sed將Copyright改為Copeleft脖捻。
文本切片和參數(shù)操作
var="This is a line of text"
echo ${var/line/REPLACED}
將line替換成REPLACED
第五章
這章主要講web,我使用較少兆衅,就主要記錄自己使用的命令
下載軟件(如BLUPF90)
wget URL1 URL2 URL3 地沮。。涯保。#簡(jiǎn)單實(shí)現(xiàn)多個(gè)下載
選項(xiàng)-t诉濒, 可以指定嘗試下載的次數(shù),如:
wget -t 5 URL # 嘗試5次夕春,這用于解決網(wǎng)絡(luò)不穩(wěn)定的問(wèn)題未荒, 但是如果設(shè)置為0,則會(huì)是不斷重試及志,慎用
wegt --limit-rate 20k URL # 限制下載的速度
wegt -c URL #在下載完成以前中斷片排,可以利用選項(xiàng)-c從斷點(diǎn)接著下載
另外一個(gè)cURL,
curl URL
第六章
主要講git和fossil倉(cāng)儲(chǔ),使用更少速侈,這里就跳過(guò)了吼具。但是其中的Git講解值得看看饺著。
第七章
tar
歸檔文件。 將多個(gè)文件打包為單個(gè)文件,并且保留所有的文件原本屬性
tar -cf outfile.tar file1 file2 file3.... ## 也可以广匙, tar -cf *.txt
查看合并的文件
tar -tf outfile.tar
追加:
tar -rvf org.tar new_file
兩個(gè)歸檔的文件合并:
tar -Af file1.tar file2.tar
進(jìn)行查看: tar -tvf file1.tar
對(duì)歸檔的文件中的文件刪除:
tar --delete --file file1.tar file1.txt
壓縮tar歸檔文件
常見格式有:
gzip格式:file.tar.gz 或者file.tgz tar -z
bzip2格式: file.tar.bz2 tar -j
Lempel-Ziv-Markov格式: file.tar.lzma. tar --lzma
但是也可以使用-a,讓tar自己根據(jù)擴(kuò)展名自動(dòng)選擇壓縮算法捷泞。
tar -acvf file.tar.gz file1 file2
排除部分文件:
tar -cf file.tar * --exclude "*.txt"
若排除為不同的類型文件钱反,將其放在一個(gè)文件file4中
tar -cf file.tar * -X list # 配合X選項(xiàng)
cpio命令與tar類似,這里就不再寫出
gzip
gzip 也是常用的壓縮文件命令之一眨层,gunzip是解壓庙楚, 但兩者都是對(duì)單個(gè)文件進(jìn)行處理,應(yīng)結(jié)合tar一起使用趴樱。
tar -cavvf file.tar.gz file1 file2.... ##-a 是指明根據(jù)文件拓展名推斷壓縮格式
另一種:
先 tar -cvvf file.tar file1 flile2....
再: gzip file.tar
如果有上百個(gè)文件時(shí)馒闷,則需要做個(gè)循環(huán)(-r)做逐個(gè)添加文件,
File_list="file1 file2 file3..."
for f in f
done
gzip file.tar
tar -xavvf file.tar.gz -c extract_directory #-a 自動(dòng)檢測(cè)壓縮格式
zcat
可以直接讀取gzip格式文件
壓縮率
一共有9級(jí)叁征,1級(jí)是壓縮率最低纳账,速度最快,9級(jí)則相反捺疼。
gzip -5 test # 這是壓縮6級(jí)
bzip2可以有更高的壓縮率塞祈,但是花費(fèi)的時(shí)間比gzip更長(zhǎng)
bzip2 filename #壓縮
bunzip2 filename.bz2 #解壓縮
也可以tar -xjvf filename.tar.bz2 # -j 識(shí)別bzip2格式
lzma則是優(yōu)于前兩個(gè)命令。
lzma filename
unlzma filename.lzma #解壓
zip壓縮
zip file.zip file1 file2...
unzip file.zip#解壓
pbzip2
前面介紹的只能使用單核,但現(xiàn)在LINUX一般都是多個(gè)CPU议薪,想要充分利用尤蛮,加快速度
pbzip2 myfile.tar
rsync備份
rsync -av source_path destination_path # a表示歸檔操作, v表示打印出細(xì)節(jié)或進(jìn)度
rsync -av source_dir username@host:PATH #將文件備份帶服務(wù)器或主機(jī)上
路徑反過(guò)來(lái)斯议,也可以將數(shù)據(jù)傳到本地产捞。host是服務(wù)器的IP, PATH指定了路徑哼御。
但是主機(jī)要安裝和運(yùn)行著OpenSSH服務(wù)器坯临。
通過(guò)網(wǎng)絡(luò)傳輸時(shí),對(duì)其進(jìn)行壓縮恋昼,會(huì)增加傳輸速度:
rsync -avz source destination #-z為壓縮數(shù)據(jù)
整個(gè)目錄內(nèi)容的同步:
rsync -av /home/test/ /home/backups
fsarchiver
其可以創(chuàng)建全盤鏡像看靠。并且可以備份系統(tǒng)文件,
備份: fsarchiver savefs backup.fas /dev/sda1 /dev/sda2...
恢復(fù): fsarchiver restfs backup.fsa id=0, dest=/dev/sda1
id=0是表明我們希望從備份歸檔中提取第一個(gè)分區(qū)的內(nèi)容液肌,將其恢復(fù)到dest指定的分區(qū)
如果多個(gè): fsarchiver restfs backup.fsa id=0, dest=/dev/sda1 id=1, dest=/dev/sda2