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指令碼攻略》