1. 程式人生 > >Shell筆記系列四

Shell筆記系列四

touch

用來生成空白檔案或是修改已有檔案的時間戳,-d用於指定特定的時間和日期。

[[email protected] test]# touch hello.txt
[[email protected] test]# ls
hello.txt
[[email protected] test]# touch -d "Fri Jun 25 20:50:14 IST 2018" TEST.TXT

ln

為某個檔案或者目錄在另一個位置建立一個同步的連結。連結有兩種,一種被稱為硬連結(Hard Link),另一種被稱為符號連結(Symbolic Link)。建立硬連結時,連結檔案和被連結檔案必須位於同一個檔案系統中,並且不能建立指向目錄的硬連結。而對符號連結,則不存在這個問題。預設情況下,ln產生硬連結。給ln命令加上- s選項,則建立符號連結。

ln -s target symbolic_link_name

[[email protected] test]# ln -s /var/www/ ~/web
lrwxrwxrwx. 1 root root    8 10月 20 21:16 web -> /var/www

注:使用dd命令建立iso檔案 

dd if=/dev/cdrom of=image.iso

diff

實現檔案的查詢並修補檔案的差異。diff -u 是一體化輸出,其中+起始的是新加入的行,-起始的是被刪除的行。

[[email protected] test]# cat i.txt
this is a test text
1
2
3

[
[email protected]
test]# cat I.txt this is a test txt 2 3 4 [[email protected] test]# diff -u i.txt I.txt --- i.txt 2018-12-11 21:02:52.307280907 +0800 +++ I.txt 2018-12-11 21:03:12.503434416 +0800 @@ -1,5 +1,5 @@ -this is a test text -1 +this is a test txt 2 3 +4

patch

使用patch命令來進行修補。

[[email protected] test]# diff -u i.txt I.txt > i.patch
[[email protected] test]# patch -p1 i.txt < i.patch
patching file i.txt
[[email protected] test]# cat i.txt
this is a test txt
2
3
4

[[email protected] test]# 

head

檢視文章的一小部分內容,也有可能是檔案的前n行或後n行

[[email protected] test]# head -n 2 i.txt
this is a test txt
2

列印除了最後M行之外的所有行

[[email protected] test]# head -n -3 i.txt 
this is a test txt
2

tail

列印檔案的後面指定的行數;同時tail命令常用的是見識一個內容不斷增加的檔案中出現的新行,為了能夠監視檔案的增長,tail有一個特殊的選項-f或--follow,允許tail關注檔案內容的更新並將其顯示出來。也可以指定特定程序,來決定tail命令的終止。

[[email protected] test]# tail -f /var/log/messages
Dec 11 21:26:12 localhost NetworkManager[670]: <info>  [1544534772.0154] dhcp4 (ens33):   nameserver '192.168.192.2'
Dec 11 21:26:12 localhost NetworkManager[670]: <info>  [1544534772.0155] dhcp4 (ens33):   domain name 'localdomain'

wc

用於統計檔案的行數,單詞數,字元數。

[[email protected] test]# wc i.txt
 5  8 26 i.txt
[[email protected] test]# wc -w i.txt
8 i.txt
[[email protected] test]# wc -c i.txt
26 i.txt

grep

正則表示式是用來進行模式匹配處理文字的。正則表示式有3種,位置標記,識別符號,數量修飾符。

位置標記:

^ 指定匹配正則表示式的文字必須起始於字串的首部

$指定匹配正則表示式的文字必須結束語字串的尾部

識別符號:

A字元:匹配特定的字元

.:匹配任意一個字元

[]:匹配括號內的任意一個字元

[^]:匹配不在括號內的任意一個字元

數量修飾符:

?:匹配之前的項1次或0次

+:匹配之前的項一次或多次

*:匹配之前的項0次或多次

{n}:匹配之前的項n次

{n,}:匹配之前的項至少n次

{n,m}:匹配之前的項最小n次,最大m次

在文字中搜索特定模式的文字行

[[email protected] test]# grep a i.txt
this is a test txt

grep命令預設使用基礎正則表示式,選項-E,可以使grep使用擴充套件正則表示式,也可以使用egrep命令:

[[email protected] test]# grep -E "[a-z0-9][email protected][a-z0-9]+\.[a-z]+" i.txt      
[email protected]

-o 可以只輸出匹配到的文字,-v可以打印出不匹配match_pattern的所有行,-c能夠統計出匹配模式的文字行數,-n可以列印匹配字串所在的行數

遞迴搜尋多個檔案

[[email protected] ~]# grep "text" . -R -n
./web/out.html:4: <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
./web/out.html:8: <style type="text/css">

-i選項可以匹配模式時,不考慮字元的大小寫,-e可以指定多個匹配模式,-f可以讀取檔案並使用其中的模式。

[[email protected] ~]# grep i.txt -R -n -i
.bash_history:939:vim i.txt
.bash_history:940:vim I.txt
.bash_history:942:diff i.txt I.txt

cut

使用cut按列切分檔案,能夠提取指定位置或列之間的字元,可以指定每列的分隔符,在cut中,沒列被稱為一個欄位。預設製表符是欄位的分隔符,對於沒有分隔符的行,會將該行按照原樣打印出來,使用-s選項可以禁止打印出這些行。

[[email protected] test]# cut -s -f 1,2 a.txt
1       2
4       5
7       8

預設製表符是分隔符,當然也可以使用-d設定分隔符,

[[email protected] test]# cut -f 2,3 -d "," A.txt
2,3
5,6
8,9

如果沒法根據欄位的位置來提取值,則可以根據字元位置提取,cut命令可以根據位元組或者字元來指定選擇範圍,也可以將欄位指定為某個範圍內的位元組,字元,欄位: -b位元組,-c字元,-f定義欄位

[[email protected] test]# cut -c 1-3 a.txt
1       2
4       5
7       8

sed

sed是流編輯器的縮寫,常用用法是進行文字替換,sed可以使用另一個字串來替換匹配模式,模式可以是簡單的字串或正則表示式。

sed 's/pattern/replace_string/' file

[[email protected] test]# sed 's/,/./' A.txt
1.2,3
4.5,6
7.8,9

注意:替換隻是替換了每行中模式首次匹配的內容,如果想進行全域性替換,則可以使用/g,也可以使用/#g標記可以使sed替換第N次出現的匹配。

[[email protected] test]# sed 's/,/./g' A.txt   
1.2.3
4.5.6
7.8.9

 sed命令會將s之後的字元視為命令分隔符

[[email protected] test]# sed 's,[0-9],a,g' A.txt
a,a,a
a,a,a
a,a,a

直接刪除空行,/d告訴sed不進行替換工作,而是直接刪除匹配的空行。

[[email protected] test]# cat a.txt
1       2       3
4       5       6

7       8       9
[[email protected] test]# sed '/^$/d' a.txt
1       2       3
4       5       6
7       8       9

如果將檔名傳遞為sed,它會將檔案內容輸出到stdout,但是檔案內容沒有變化,我們如果想直接在檔案中進行替換,則可以使用-i選項

[[email protected] test]# sed '/^$/d' -i a.txt 
[[email protected] test]# cat a.txt
1       2       3
4       5       6
7       8       9

也可以使用-e來組合來組合多個模式,也可以使用管道

awk

awk命令可以處理資料流,支援關聯陣列,遞迴函式,條件語句。awk的指令碼結構如下:

awk "BEGIN{ print "start" } pattern {commands} END {print "end"}' file

awk指令碼通常由3部分組成:BEGIN,END和帶模式匹配選項的公共語句塊,這三個部分都是可選的,可以不用出現在指令碼中。

[[email protected] test]# awk "BEGIN {i=0} {i++} END {print i}" i.txt 
5

awk的工作方式:

⑴首先執行BEGIN{command}語句塊中的語句,這裡的語句可以是變數初始化,列印輸出,這是一個可選的語句塊;

⑵接著從檔案或stdin中讀取一行,如果能夠匹配pattern,則執行隨後的command語句塊,重複這個過程,直至檔案全部被讀取完畢,這個語句同樣也是可選的,如果不提供,則預設執行{print},即列印所讀取到的每一行

⑶讀讀取至輸入流末尾時,執行END{command}語句塊,這個也是可選的。

注意,如果沒有提供模式,則awk就認為所有的行都是匹配的。

[[email protected] test]# echo -e "liu\nddddd" | awk 'BEGIN {print "START"} {print} END {print "END"}'  
START
liu
ddddd
END

awk命令是一個直譯器,它能夠解釋並執行程式,和shell一樣,它包括一些特殊變數

......

 

 

內容參考《Linux Shell指令碼攻略》