Shell筆記系列三
tr
tr可以對來自標準輸入的內容進行字元替換,字元刪除,重複字元壓縮。tr只能通過stdin接受輸入,呼叫格式為tr [options] set1 set2
tr將輸入中的字元由大寫轉換成小寫,以及字元對映
FIGHTING...echo "hello world" | tr 'a-z' 'A-Z'
HELLO WORLD
FIGHTING...echo "hello 123456 | tr '0-9' '9876543210'
876543
tr刪除字元
FIGHTING...echo "hello 123 world " | tr -d '0-9' hello world
字元組補集
FIGHTING...echo "hello 1 word 2 next 3" | tr -d -c '0-9 \n'
1 2 3
FIGHTING...echo "hello 1 word 2 next 3" | tr -c '0-9' ' '
1 2 3
字元壓縮
FIGHTING...echo "hello world my tttt" |tr -s ' '
hello world my tttt
校驗和與核實
校驗和程式用來從檔案中生成相對較小的唯一金鑰,我們可以通過重新計算該金鑰,來減產檔案是否在發生改變
可以使用md5sum filename , md5sum是一個長度為32個字元的十六進位制串,我們可以將其重定向到一個檔案,然後再用來核實檔案是否發生變化。當然也可以用於目錄中。
FIGHTING...md5sum md5sum LOG.TXT > logmd5sum.md5
FIGHTING...md5sum -c logmd5sum.md5
LOG.TXT: OK
FIGHTING...
行排序
sort命令能夠對文字檔案和stdin進行排序,可以配合其他命令來生成所需要的輸出。uniq經常與sort一同使用,提取不重複的行。
FIGHTING...sort test.txt test2.txt > test3.txt FIGHTING...cat test3.txt 123 123 456 456 789 999 hello world -name : liudong toady is a fine day.
按照是數字排序(-n) 逆序排列 -r 按照月份排列 -M,合併已經排序過的檔案 -m,
FIGHTING...sort -n test2.txt
123
123
456
456
789
999
找出已經排序檔案中不重複的行:
FIGHTING...cat test2.txt
123
456
789
123
456
999
FIGHTING...sort test2.txt |uniq
123
456
789
999
FIGHTING...
按照列或者鍵來排序,-k指定排序所依據的字元,注意:按數字順序排序和按字母表順序排序所處理的方式不同,如果要採用按數字順序排序,就應該明確給出-n選項。
FIGHTING...sort -nrk 1 test2.txt
999
789
456
456
123
123
uniq
uniq從給定輸入中找出唯一的行,只能用作排序的資料,因此uniq通常與sort命令結合。
FIGHTING...sort test2.txt | uniq
123
456
789
999
FIGHTING...
分割檔案和資料
split命名可以用來分割檔案,命令接受檔名作為引數,然後建立一系列體積更小的檔案,分割的內容依據字母順序一次排序。
分割單位有K(KB),M(MB),G(GB),C(byte),W(word).新檔案以xab,xac,xad...命令split預設使用字母后綴,如果想使用數字,可以使用-d
FIGHTING...split -b 10k output.session
FIGHTING...ls
3 xci xfe xia xkw xns xqo xtk xwg xzaac xzacy xzafu
helloworld.sh xcj xff xib xkx xnt xqp xtl xwh xzaad xzacz xzafv
iff.sh xck xfg xic xky xnu xqq xtm xwi xzaae xzada xzafw
ifs.sh xcl xfh xid xkz xnv xqr xtn xwj xzaaf xzadb xzafx
logmd5sum.md5 xcm xfi xie xla xnw xqs xto xwk xzaag xzadc xzafy
LOG.TXT xcn xfj xif xlb xnx xqt xtp xwl xzaah xzadd xzafz
output.session xco xfk xig xlc xny xqu xtq xwm xzaai xzade xzaga
std.sh xcp xfl xih xld xnz xqv xtr xwn xzaaj xzadf xzagb
test2.txt xcq xfm xii xle xoa xqw xts xwo xzaak xzadg xzagc
test3.txt xcr xfn xij xlf xob xqx xtt xwp xzaal xzadh xzagd
test.txt xcs xfo xik xlg xoc xqy xtu xwq xzaam xzadi xzage
TEST.TXT xct xfp xil xlh xod xqz xtv xwr xzaan xzadj xzagf
timing.log xcu xfq xim xli xoe xra xtw xws xzaao xzadk xzagg
typescript xcv xfr xin xlj xof xrb xtx xwt xzaap xzadl xzagh
xaa xcw xfs xio xlk xog xrc xty xwu xzaaq xzadm xzagi
xab xcx xft xip xll xoh xrd xtz xwv xzaar xzadn xzagj
xac xcy xfu xiq xlm xoi xre xua xww xzaas xzado xzagk
xad xcz xfv xir xln xoj xrf xub xwx xzaat xzadp xzagl
xae xda xfw xis xlo xok xrg xuc xwy xzaau xzadq xzagm
按照行分割,使用 -l number filename
dd
建立特定大小的檔案,dd會克隆給定的輸入內容,然後將一模一樣的一份副本寫入到輸出。stdin,裝置檔案,普通檔案都可作為輸入,stdout,裝置檔案,普通檔案也可作為輸出。
建立一個內容全部為零的1MB大小的檔案test.data./dev/zero是一個特殊的字元裝置,它會返回0值位元組。
FIGHTING...dd if=/dev/zero of=test.txt bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.0024947 s, 420 MB/s
comm
comm命令可以比較兩個已經排序的檔案,它可以顯示出第一個檔案和第二個檔案所獨有的行以及這兩個檔案所共有的行。
不帶任何引數的comm,結果輸出的第一列包含只在file1檔案中出現,第二列包含只在file2檔案中出現,第三列是包含file1,file2共有的行。
FIGHTING...comm test.txt test2.txt
123
345
666
dong
haha
hahha
liu
sdf
FIGHTING...
刪除前兩列,只打印第三列,-1選項可以刪除第一列,-2選項可以刪除第二列,最後留下第三列。同理刪除第三列就可以列印兩個互不相同的那些行。
FIGHTING...comm test.txt test2.txt -1 -2
123
666
FIGHTING...
chmod
chmod用於設定檔案的許可權。檔案的許可權有R,W,X對應的數字為4,2,1。同時一個檔案有三個角色許可權,一個是使用者(u),即檔案所屬者,另一個是使用者組(g),用於方便管理同一組使用者,剩下一個是其他(o),即不是使用者,也和使用者不在一個組的其他角色。使用ls命令可以檢視檔案的所屬者,以及使用者組,其他角色的相應的許可權。
FIGHTING...ls -al test.txt
-rw-rw-r--. 1 ld ld 21 Dec 10 06:29 test.txt
改變使用者的許可權(注意,即使給檔案加了執行(x)許可權,但是如果其內容不是可執行,也不會產生什麼效果),增加許可權使用+,減少許可權使用-,同時可以數字來進行許可權的賦值,通過3位數字來賦值,例如764,每一位表示不同的角色,第一位表示使用者,第二位表示使用者組,第三位表示其他,同時每位數字表示的是許可權的總和,例如第一位改為讀寫許可權,即W+R = 4+2 = 6,即用數字6即可。
FIGHTING...ll
total 8
-rw-rw-r--. 1 ld ld 23 Dec 10 06:29 test2.txt
-rw-rw-r--. 1 ld ld 21 Dec 10 06:29 test.txt
FIGHTING...chmod u+x test.txt
FIGHTING...ll
total 8
-rw-rw-r--. 1 ld ld 23 Dec 10 06:29 test2.txt
-rwxrw-r--. 1 ld ld 21 Dec 10 06:29 test.txt
-rwxrw-r--. 1 ld ld 21 Dec 10 06:29 test.txt
FIGHTING..../test.txt
./test.txt: line 1: 123: command not found
./test.txt: line 2: 345: command not found
./test.txt: line 3: 666: command not found
./test.txt: line 4: haha: command not found
./test.txt: line 5: sdf: command not found
chown
改變使用者所屬組:chown user:group filename
-rwxrw-r--. 1 ld ld 21 Dec 10 06:29 test.txt
FIGHTING...chown ld:mysql test.txt
FIGHTING...ll
total 8
-rw-rw-r--. 1 ld ld 23 Dec 10 06:29 test2.txt
-rwxrw-r--. 1 ld mysql 21 Dec 10 06:29 test.txt
chattr
將檔案設定為不可修改
FIGHTING...sudo chattr +i test.txt
FIGHTING...ll
total 8
-rw-rw-r--. 1 ld ld 23 Dec 10 06:29 test2.txt
-rwxrw-r--. 1 ld mysql 21 Dec 10 06:29 test.txt
FIGHTING...rm -rf test.txt
rm: cannot remove ‘test.txt’: Operation not permitted
內容參考《Linux Shell指令碼攻略》