#!/bin/bash
IFS=:
read aa bb cc < /etc/passwd
echo $aa $bb $cc
(注:默認shell是無法將/etc/passwd中那些以冒號分割的字符串分割的,通過設(shè)置IFS可以實現(xiàn)這一點,詳情見本文底部)
我們將看到的結(jié)果是前兩個變量被賦予了正確的值,最后一個變量被賦予了文件第一行剩下的所有值。(因為read一次只能讀一行)
而現(xiàn)實中如果一個文件保存了這樣一個電話本:
路人甲 13900000000
主角A 23320000
神秘人 12x0x0x0000
旁白 85600000
……
如果我們要寫一個腳本來實現(xiàn)該電話本的查詢,通常會這樣寫:
#!/bin/bash
while read name num
do
if [ $name = $1 ]
then echo $num
fi
done
當我們把想查詢的人名作為參數(shù)來啟動腳本,就可以看到他的號碼,然后給他打騷擾電話……
(關(guān)于while等流程控制語句,我會在稍后整理)
抽取行
head -x 文件 //抽取前x行
tail -x 文件 //抽取末尾x行
sed -n xp 文件 //抽取文件中的第x行 注:這里的-n就是-n,不代表別的。
抽取列
cut -fx -dy 文件 //以y作為分隔符,抽取第x列
awk -Fy '{print $x}' 文件 //以y作為分隔符,抽取第x列
注:awk可以抽取多列,在指令中使用逗號分割,例:
awk -F: '{print $3,$5}' /etc/passwd
將會抽取文件中的第3列和第5列
排序
sort -ty +xn 文件 //以y作為分隔符,以第1+x列為基準排序
注:如果使用了該指令,則不能在同一語句內(nèi)使用其它參數(shù),如有需要,只能在管道中再sort一次,如: sort +4n /etc/fstab | sort -r
其它參數(shù): n 對數(shù)字排序
d 對字母排序
M 對月份排序(諸如JAN,FEB....DEC之類)
r 逆向
$IFS
很多時候我們并不需要指定分隔符,因為$IFS默認包含了空格,\t和換行符。
只有遇到其它分隔符是我們才需要特別指定,比如$PATH和/etc/passwd中就是以冒號分割,遇到類似這種情況,我們才需要對$IFS進行指定。