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

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