Shell_3


tags: Shell
Categories: Shell


第四章-讓文本飛

需要熟練的使用sed, awk, grep, cut可以較好的處理文本文件

使用正則表達(dá)式

1. 位置錨點(diǎn)

"^" : 表示匹配的文本榔至,必須起始于字符串的首部,eg: ^renf 能夠匹配renf開頭的行
” 此為結(jié)尾方援, eg: dat 能夠匹配以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' file 其中^匹配空行, /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ù)量
0: 所有的變量1: 第一列的內(nèi)容

NF 可以表示最后一列,(NF-1)表倒數(shù)第二列
-V 可以將外部值傳遞給awk
當(dāng)輸入的變量來(lái)自文件時(shí)拌屏,也可以: awk '{ print v1, v2 }' v1=var1 v2=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 NF }' file #分隔符為: 使用循環(huán): for (i=0;i<10;i++) { printi ; }

替換
awk '{sub(/test/, "no", 0);print}' input.txt 進(jìn)行替換潮针,類似sed的功能, cat renaddf90 | awk '{ sub(/3/, "999",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 File_list; do tar -rvf file.tarf
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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末挟炬,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嗦哆,更是在濱河造成了極大的恐慌谤祖,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件老速,死亡現(xiàn)場(chǎng)離奇詭異粥喜,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)橘券,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門额湘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人旁舰,你說(shuō)我怎么就攤上這事缩挑。” “怎么了鬓梅?”我有些...
    開封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)谨湘。 經(jīng)常有香客問(wèn)我绽快,道長(zhǎng),這世上最難降的妖魔是什么紧阔? 我笑而不...
    開封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任坊罢,我火速辦了婚禮,結(jié)果婚禮上擅耽,老公的妹妹穿的比我還像新娘活孩。我一直安慰自己,他們只是感情好乖仇,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開白布憾儒。 她就那樣靜靜地躺著询兴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪起趾。 梳的紋絲不亂的頭發(fā)上诗舰,一...
    開封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音训裆,去河邊找鬼眶根。 笑死,一個(gè)胖子當(dāng)著我的面吹牛边琉,可吹牛的內(nèi)容都是我干的属百。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼变姨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼族扰!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起钳恕,我...
    開封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤别伏,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后忧额,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體厘肮,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年睦番,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了类茂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡托嚣,死狀恐怖巩检,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情示启,我是刑警寧澤兢哭,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站夫嗓,受9級(jí)特大地震影響迟螺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜舍咖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一矩父、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧排霉,春花似錦窍株、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)后裸。三九已至,卻和暖如春辙售,著一層夾襖步出監(jiān)牢的瞬間轻抱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工旦部, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祈搜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓士八,卻偏偏與公主長(zhǎng)得像容燕,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子婚度,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容