read一次可以為多個變量賦值——但一次只能讀一行,比如:
#!/bin/bash
IFS=:
read aa bb cc < /etc/passwd
echo $aa $bb $cc
(注:默認shell是無法將/etc/passwd中那些以冒號分割的字符串分割的,通過設置IFS可以實現這一點,詳情見本文底部)
我們將看到的結果是前兩個變量被賦予了正確的值,最后一個變量被賦予了文件第一行剩下的所有值。(因為read一次只能讀一行)
而現實中如果一個文件保存了這樣一個電話本:
路人甲 13900000000
主角A 23320000
神秘人 12x0x0x0000
旁白 85600000
……
如果我們要寫一個腳本來實現該電話本的查詢,通常會這樣寫:
#!/bin/bash
while read name num
do
if [ $name = $1 ]
then echo $num
fi
done
當我們把想查詢的人名作為參數來啟動腳本,就可以看到他的號碼,然后給他打騷擾電話……
(關于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列為基準排序
注:如果使用了該指令,則不能在同一語句內使用其它參數,如有需要,只能在管道中再sort一次,如: sort +4n /etc/fstab | sort -r
其它參數: n 對數字排序
d 對字母排序
M 對月份排序(諸如JAN,FEB....DEC之類)
r 逆向
$IFS
很多時候我們并不需要指定分隔符,因為$IFS默認包含了空格,\t和換行符。
只有遇到其它分隔符是我們才需要特別指定,比如$PATH和/etc/passwd中就是以冒號分割,遇到類似這種情況,我們才需要對$IFS進行指定。
posted on 2010-09-17 16:05
xzc 閱讀(734)
評論(0) 編輯 收藏 所屬分類:
linux/unix