語法 : grep [options] pattern 檔案
[options] 說明
-n 附帶列號
-i 不區分大小寫
-v 和pattern相反
-l 印出含有pattern之檔名
-c 只印出列號
-w 符合整個word,非部分符合
-r 遞迴遍歷目錄
-2 找到pattern那一列,並印出前後兩列,包含自已
-A 2 找到pattern那一列,並印出後兩列,包含自已
-B 2 找到pattern那一列,並印出前兩列,包含自已
-e 視pattern裡的所有character為一般的character
-x 除非pattern 符合 entire line , 否則不列印出來
-f 把patten放到檔案中
2007年10月16日 星期二
命令列程式
命令列程式
命令列程式通常是單獨存在的程式,執行前會先在搜尋路徑中去尋找。
常見的有:
cp, date, who, w, ls, cat, wc, last, mv, mkdir, rmdir, mv, ps, top, df, du, dd
ln, sort, sed, awk, ifconfig, dmesg, hostname, dnsdomainname, chmod, chown, chgrp
cut, grep, kill, more, less, mount, nice, ping, sleep, su, tar, gzip, touch,
uname, basename, dirname, tr, uniq, mail
以下介紹幾個簡單命令的用法
date
用途:顯示 or 設定 系統的日期和時間
用法:
date
結果顯示現在的日期時間
date MMDDhhmmYY
調整時間,格式為 月 MM 日 DD 時 hh 分 mm 年 YY
如: date 080109252002 是將時間調為 2002/08/01 09:25
date +格式
控制日期時間的輸出格式
如: date +'%d %H %M' 將顯示現在的 "日 時 分"
其它進一步的用法,請 man date 查閱線上文件。
who
用途:顯示現在誰登入主機
用法:
who
顯示: ols3 pts/0 Aug 1 13:54
whoami 則顯示自己的登入帳號
ls
用途:列出目錄內容
用法:
ls
結果:列出目前所在目錄的內容
ls -a
結果:列出目前所在目錄的內容,包括隱藏檔。
ls -la
結果:使用長列模式列出目前所在目錄的內容,包括隱藏檔。
其它進一步的用法,請 man ls 查閱線上文件。
cat
用途:連結檔案內容並顯示出來
用法:
cat dataf1
結果:顯示 dataf1 的檔案內容
cat dataf1 dataf2
結果:連結 dataf1, dataf1 的內容,並予顯示。
cat >>urmail.txt
kdkdkdkdkdkdkdkdkdk (Enter)
^D
將 cat 拿來當作簡易編輯器。
其它進一步的用法,請 man cat 查閱線上文件。
wc
用途:計算檔案內字數或列數
用法:
wc -l dataf1
結果:顯示 dataf1 的檔案內共有幾列
wc -c dataf1
結果:顯示 dataf1 共有多少字元。
wc -w dataf1
結果:顯示 dataf1 共有多少句元。
其它進一步的用法,請 man wc 查閱線上文件。
ln
用途:鏈結檔案;ln 提供一個方便的機制,使同一個檔案可以有多個檔名
用法:
ln f1 f2
結果:將 f1 鏈結到 f2 (硬式鏈結),f2 的檔案內容和 f1 一模一樣
ln -s f1 f3
結果:將 f1 鏈結到 f3 (軟式鏈結),f3 是 f1 的別名,取用 f3 時,實際上是存取 f1
ln -sf f1 f3
結果:同上,唯若 f3 早已存的話,將被刪除後再重建一個新的
其它進一步的用法,請 man ln 查閱線上文件。
basename
用途:取得路徑名稱中最後的檔名部份
用法:
basename /usr/local/bin/sftp
結果:出現 sftp
以下可以得到相同結果:
baseNAME.sh #! /bin/sh
# 模擬 basename 指令
bn=${1##*/}
echo $bn
===============
./baseNAME.sh /usr/local/bin/sftp
結果為
sftp
dirname
用途:取得路徑名稱中的目錄部份
用法:
dirname /usr/local/bin/sftp
結果:出現 /usr/local/bin
以下可以得到相同結果:
dirNAME.sh #! /bin/sh
# 模擬 dirname 指令
dn=${1%/*}
echo $dn
===============
./dirNAME.sh /usr/local/bin/sftp
結果為
/usr/local/bin
sort
用途:對文字檔的列做排序
用法:
sort dataf4
結果:將 dataf4 做升冪排序
sort -r dataf4
結果:將 dataf4 做降冪排序
sort -n dataf4
結果:將 dataf4 做升冪排序,但以字串的數值大小為比較的標準
sort -n +2 dataf3
結果:跳過前二欄,以 dataf3 中的第三欄做排序,且以字串的數值大小為比較的標準
sort -nr +2 -t: /etc/passwd
結果:-t: 是說改用 : 為分隔符號,+2 是說跳過前二欄,以 /etc/passwd 中的第三欄做降序排序,且 -n 指示 sort 以字串的數值大小為比較的標準,-r 是降冪排列
其它進一步的用法,請 man sort 查閱線上文件。
uniq
用途:對已排序好的檔案刪除重覆列
用法:
uniq dataf3
結果:若重覆列並未連續擺在一起, 則不會有任何作用
sort dataf3 | uniq
結果:刪除 dataf3 檔中的重覆列
sort dataf3 | uniq -d
結果:挑出重覆列
sort dataf3 | uniq -c
結果:計算每一列的重覆數目
其它進一步的用法,請 man uniq 查閱線上文件。
cut
用途:對檔案的每一列抽出某一部份
用法:
cut -c2 dataf1
結果:抽出 dataf1 中每一列的第 2 個字元
cut -c3-10 dataf1
結果:抽出 dataf1 中每一列的第 3 到第 10 個字元
cut -c9- dataf1
結果:抽出 dataf1 中每一列的第 9 以後的字元
cut -c1-3,22- dataf1
結果:抽出 dataf1 中每一列的第 1 到第 3 個字元、以及第 22 個以後的的字元
cut -d: -f1 /etc/passwd
結果:抽出 /etc/passwd 中的第一欄位,-d: 指示 cut 改用 : 為分隔符號,-f1 是第一欄之意
上述指令可拿來找出所有系統的帳號名稱
cut -d: -f3,4 /etc/passwd
結果:抽出 /etc/passwd 中的第3,4欄位
其它進一步的用法,請 man cut 查閱線上文件。
paste
用途:對檔案以列和列合併
用法:
paste dataf1 dataf2
結果:dataf1 的每一列 和 dataf2 的每一列合併,預設以 TAB 分隔
paste -d'#' dataf1 dataf2
結果:dataf1 的每一列 和 dataf2 的每一列合併,以 # 分隔
paste -s dataf4
結果:dataf4 的每一列自己合併在一起 (-s : same file),預設以 TAB 分隔
其它進一步的用法,請 man paste 查閱線上文件。
tr
用途:轉換或刪除字元
用法:
tr k K < dataf1
結果:dataf1 的 k 換成 K 字元
tr ',' '\n' < ttt
結果:ttt 的 , 號換成 換行字元(\n)
tr -d k
結果:k 字元全刪除
cut -d: -f1-6 /etc/passwd | tr : '+'
結果:將 passwd 的六個欄改以 + 分隔
tr '[A-Z]' '[a-z]' < dataf1
結果:將大寫全換成小寫字母
tr '[a-z]' '[A-Z]' < dataf1
結果:將小寫全換成大寫字母
tr -s ' ' ' ' < dataf1
結果:將多餘的空白移除只剩一個 (-s 是壓擠的意思)
其它進一步的用法,請 man tr 查閱線上文件。
grep
用途:顯示符合樣式的列
用法:
grep A *
結果:將含有 A 這個字元的檔案及列顯示出來
grep -i A *
結果:將含有 A或a 這個字元的檔案及列顯示出來 (-i 是不分大小寫之意)
grep -v La data3
結果:將不含 La 的列顯示出來 (-v 是不包含之意)
grep -l La *
結果:只顯示那些檔案包含 La,不秀出符合的列
grep -n La *
結果:也秀出列號
dmesg | grep eth0
結果:將含有 eth0 的訊息列顯示出來
grep -q keyword filename
結果:若 filename 含有 keyword 則傳回 0 (真),否則傳為非 0
命令執行完之後,它的傳回值放在 $? 這個變數中,只要 echo $? 便可得知成功與否,請記住:0 為成功,非 0 為失敗 !
練習用的資料檔
dataf1 的內容:
John TNC 721 7654321
Marry TCC 678 1234567
Jack KCC 123 ABCDEFG
Bob PTC 345 efghijk
Anne TPC 987 1098643
dataf2 的內容:
Susan XXX 121 1AB57RT
Jeff AAA 478 JaBdkdk
Henry BBB 193 LaLaLaL
Allan DDD 621 Bobojto
Ken JJJ 094 sssssss
dataf3 的內容:
987 XXX 121 1AB57RT
234 AAA 478 JaBdkdk
765 BBB 193 LaLaLaL
512 DDD 621 Bobojto
363 JJJ 094 sssssss
765 BBB 193 LaLaLaL
dataf4的內容:
98
2341
7
51
363
常用的特殊字元
\b 後退
\f 跳頁
\n 換行字元
\r return
\t TAB
一個命令列執行好幾個命令
有二種方式:
每個命令之間用 ; 號隔開
如 ./configure ; make ; make install
每個命令之間用 && 號隔開
如 ./configure && make && make install
問題:這二者有何差別?
&& 表示前一個命令執行成功之後,才會接著執行下一個,這樣可讓我們確保所有的命令是否都成功執行。
這經常運用在自動安裝 script 檔中,以下是我平時使用的自動安裝 Apache 及 PHP 的 script 檔:
#! /bin/sh
tar xvzf apache*.gz &&
tar xvzf php*.gz &&
echo "Configure apache ...." &&
cd apache* &&
./configure --prefix=/usr/local/apache &&
cd .. &&
cd php* &&
./configure \
--with-apache=../apache_1.3.26 \
--with-mysql=/home/mysql &&
make &&
make install &&
cd .. &&
cd apache* &&
./configure \
--prefix=/usr/local/apache \
--activate-module=src/modules/php4/libphp4.a &&
make &&
make install &&
cd ../php* &&
cp -f php.ini-dist /usr/local/lib/php.ini
註: 若一列寫不完,可在該列末尾加上接續符號 \
註: 另有 || 的用法:如 命令1 || 命令2 || 命令3
|| 是或之意,當命令1執行成功時,就不會再往下執行,若命令1執行失敗,才會執行命命2
只有當前面二個命命都執行失敗,命令3 才會被執行
也可以把數個命令弄成一組,然後整組去執行它:
第一種方法:(命令1; 命令2; 命令3; ....)
( ) 會開啟一個子 shell 環境來執行括號中的命令組
以下是把一組命令放入背景中執行:
(sort mydata -o result.txt; procdata result.txt) &
第二種方法:{ 命令1; 命令2; 命令3; .... }
不同的是,此法是把這些命令組在現行的 shell 中執行,而非在子 shell 中執行
注意 { 右方、} 左方都要有空白,每個命令都要以 ';'這個符號結束
命令列郵寄帶檔的方法
以下是將 README 這個檔案郵件帶檔寄給 ols3@www.tnc.edu.tw
#! /bin/sh
# 由命令列寄帶檔的信件
# 方法 1: 使用 uuencode 編碼
例1
uuencode README README | mail -s "test attach msg file" ols3@www.tnc.edu.tw
上述的意思是說:把 README 這個檔案(第一個 README)予以 uuencode 編碼,且將 README (第二個 README) 這個名字寫入編碼檔的檔頭,再交給 mail 寄給收信者。
例2
uuencode nc11nt.zip nc11nt.zip | mail -s "test attach msg file" ols3@www.tnc.edu.tw
# 解碼法: uudecode 編碼檔
# 或由 OutLook Express 等讀取信件的程式自動解碼。
# ------------------------------------------------------------------------------
# 方法 2: 使用 base64 編碼
uuencode -m README README | mail -s "test attach msg file" ols3@www.tnc.edu.tw
# 解碼:
# uudecode 編碼檔
# 或
# uudecode 編碼檔 -o 指定輸出檔名
# 如 uudecode encode.txt -o nc11.zip
WinZip 也可以對 uuencode 編碼檔加以解碼,方法如下:
1. 把 uuencode 檔存為 .uue,若是 base64 編碼可存成 .b64
2. 用 WinZip 開啟編碼檔,即可按一般解壓動作來予以解碼。
=========================================================
# 註: uuencode 的用法例:
uuencode nc11nt.zip nc11nt.zip > p.txt
第一個檔名 nc11nt.zip 告訴 uuencode 要編碼的檔案是那一個,
第二個檔名 nc11nt.zip 是要 uuencode 把該檔名寫入 p.txt 表頭
它會在 p.txt 的第一列出現:
begin 600 nc11nt.zip
這樣子別人收到您的編碼檔,對方才知道您編碼之前的檔案格式為何?
因此,一般而言,uuencode 之後的二個檔名,我們都會弄成一樣。
p.txt 的內容截錄如下:
begin 600 nc11nt.zip
M4$L#!!0``@`(`.B88QW[!E;'=`<``)T2```(````9V5T;W!T+FC%5]MNXS@2
M?8X!_T-A%IA M[#B77LS+-B*T)9'%JE.G3I5.CNBSS"MAA5=&.UH82TOIS=I_Z':(J&_63U8M
M2T\'_4,Z_?3/3QE]^HCK%-<9KI]P_94NK90T,0O_**RD2U/K(AC,:*!S6.IV
MIJ6"=55)PO]K83V9!?E2TM7PEOITK>96V*1`/O:"6-@Q'TV93
MM\.[^E3%'1F5YE$^2(NM4[QXOK52#]*1TG2R+$Z6NC[!KN3.SLE\RH*C<"F*
M5"DY6%>WAC">ABQ-CNYV5*=3BB9\@7)S)?N'LE=L.K3%_);6T
MHJ*;>EZI'(]SJ9TDX;J=-3]RI2QH_A3VO87F.4F%]Y80KL,]G:63NIUD+R/D
M[T!X]MT2LHA5AW#XB2KA-QO?AF`3:<&PL3>E62.N$D81Z:.J*II+JIUM[6`I?1M,OXQNI]0;WM&WWGC<&T[OSK'4EP9OD9QH2*W6E8)=1&6%]D\AF5\O
MQOTOV-#[>7`]F-ZQ_Y>#Z?!B,J'+T9AZ=-,;3P?]V^O>F&YNQS>CR04R/9&R
M09AC?Q=BIO3*`,A">J$J%X*_0VX=W*L**L6#1(YS":X4)"@'Y;^?P19R$I71
MRQ#M2SZ?DTN>!NKW1S=W@^'5A^O!S\QTA*^-S^C1*C#+FW>3'TLIH[__XV_T
......省略
M`@`(`%9^1B0K8B6N!%\``%3Q```*``````````$`(`"V@50,`0!H;V)B:70N
M='AT4$L!`A0`%``"``@`H8Y&),B0K1B*"P`` D@&L!`')E861M92YT>'102P4&``````D`"0#I`0``,G`
end
==============================================================
用以下方法即可解碼回來:
uudecode p.txt -o nc11.zip
命令列程式通常是單獨存在的程式,執行前會先在搜尋路徑中去尋找。
常見的有:
cp, date, who, w, ls, cat, wc, last, mv, mkdir, rmdir, mv, ps, top, df, du, dd
ln, sort, sed, awk, ifconfig, dmesg, hostname, dnsdomainname, chmod, chown, chgrp
cut, grep, kill, more, less, mount, nice, ping, sleep, su, tar, gzip, touch,
uname, basename, dirname, tr, uniq, mail
以下介紹幾個簡單命令的用法
date
用途:顯示 or 設定 系統的日期和時間
用法:
date
結果顯示現在的日期時間
date MMDDhhmmYY
調整時間,格式為 月 MM 日 DD 時 hh 分 mm 年 YY
如: date 080109252002 是將時間調為 2002/08/01 09:25
date +格式
控制日期時間的輸出格式
如: date +'%d %H %M' 將顯示現在的 "日 時 分"
其它進一步的用法,請 man date 查閱線上文件。
who
用途:顯示現在誰登入主機
用法:
who
顯示: ols3 pts/0 Aug 1 13:54
whoami 則顯示自己的登入帳號
ls
用途:列出目錄內容
用法:
ls
結果:列出目前所在目錄的內容
ls -a
結果:列出目前所在目錄的內容,包括隱藏檔。
ls -la
結果:使用長列模式列出目前所在目錄的內容,包括隱藏檔。
其它進一步的用法,請 man ls 查閱線上文件。
cat
用途:連結檔案內容並顯示出來
用法:
cat dataf1
結果:顯示 dataf1 的檔案內容
cat dataf1 dataf2
結果:連結 dataf1, dataf1 的內容,並予顯示。
cat >>urmail.txt
kdkdkdkdkdkdkdkdkdk (Enter)
^D
將 cat 拿來當作簡易編輯器。
其它進一步的用法,請 man cat 查閱線上文件。
wc
用途:計算檔案內字數或列數
用法:
wc -l dataf1
結果:顯示 dataf1 的檔案內共有幾列
wc -c dataf1
結果:顯示 dataf1 共有多少字元。
wc -w dataf1
結果:顯示 dataf1 共有多少句元。
其它進一步的用法,請 man wc 查閱線上文件。
ln
用途:鏈結檔案;ln 提供一個方便的機制,使同一個檔案可以有多個檔名
用法:
ln f1 f2
結果:將 f1 鏈結到 f2 (硬式鏈結),f2 的檔案內容和 f1 一模一樣
ln -s f1 f3
結果:將 f1 鏈結到 f3 (軟式鏈結),f3 是 f1 的別名,取用 f3 時,實際上是存取 f1
ln -sf f1 f3
結果:同上,唯若 f3 早已存的話,將被刪除後再重建一個新的
其它進一步的用法,請 man ln 查閱線上文件。
basename
用途:取得路徑名稱中最後的檔名部份
用法:
basename /usr/local/bin/sftp
結果:出現 sftp
以下可以得到相同結果:
baseNAME.sh #! /bin/sh
# 模擬 basename 指令
bn=${1##*/}
echo $bn
===============
./baseNAME.sh /usr/local/bin/sftp
結果為
sftp
dirname
用途:取得路徑名稱中的目錄部份
用法:
dirname /usr/local/bin/sftp
結果:出現 /usr/local/bin
以下可以得到相同結果:
dirNAME.sh #! /bin/sh
# 模擬 dirname 指令
dn=${1%/*}
echo $dn
===============
./dirNAME.sh /usr/local/bin/sftp
結果為
/usr/local/bin
sort
用途:對文字檔的列做排序
用法:
sort dataf4
結果:將 dataf4 做升冪排序
sort -r dataf4
結果:將 dataf4 做降冪排序
sort -n dataf4
結果:將 dataf4 做升冪排序,但以字串的數值大小為比較的標準
sort -n +2 dataf3
結果:跳過前二欄,以 dataf3 中的第三欄做排序,且以字串的數值大小為比較的標準
sort -nr +2 -t: /etc/passwd
結果:-t: 是說改用 : 為分隔符號,+2 是說跳過前二欄,以 /etc/passwd 中的第三欄做降序排序,且 -n 指示 sort 以字串的數值大小為比較的標準,-r 是降冪排列
其它進一步的用法,請 man sort 查閱線上文件。
uniq
用途:對已排序好的檔案刪除重覆列
用法:
uniq dataf3
結果:若重覆列並未連續擺在一起, 則不會有任何作用
sort dataf3 | uniq
結果:刪除 dataf3 檔中的重覆列
sort dataf3 | uniq -d
結果:挑出重覆列
sort dataf3 | uniq -c
結果:計算每一列的重覆數目
其它進一步的用法,請 man uniq 查閱線上文件。
cut
用途:對檔案的每一列抽出某一部份
用法:
cut -c2 dataf1
結果:抽出 dataf1 中每一列的第 2 個字元
cut -c3-10 dataf1
結果:抽出 dataf1 中每一列的第 3 到第 10 個字元
cut -c9- dataf1
結果:抽出 dataf1 中每一列的第 9 以後的字元
cut -c1-3,22- dataf1
結果:抽出 dataf1 中每一列的第 1 到第 3 個字元、以及第 22 個以後的的字元
cut -d: -f1 /etc/passwd
結果:抽出 /etc/passwd 中的第一欄位,-d: 指示 cut 改用 : 為分隔符號,-f1 是第一欄之意
上述指令可拿來找出所有系統的帳號名稱
cut -d: -f3,4 /etc/passwd
結果:抽出 /etc/passwd 中的第3,4欄位
其它進一步的用法,請 man cut 查閱線上文件。
paste
用途:對檔案以列和列合併
用法:
paste dataf1 dataf2
結果:dataf1 的每一列 和 dataf2 的每一列合併,預設以 TAB 分隔
paste -d'#' dataf1 dataf2
結果:dataf1 的每一列 和 dataf2 的每一列合併,以 # 分隔
paste -s dataf4
結果:dataf4 的每一列自己合併在一起 (-s : same file),預設以 TAB 分隔
其它進一步的用法,請 man paste 查閱線上文件。
tr
用途:轉換或刪除字元
用法:
tr k K < dataf1
結果:dataf1 的 k 換成 K 字元
tr ',' '\n' < ttt
結果:ttt 的 , 號換成 換行字元(\n)
tr -d k
結果:k 字元全刪除
cut -d: -f1-6 /etc/passwd | tr : '+'
結果:將 passwd 的六個欄改以 + 分隔
tr '[A-Z]' '[a-z]' < dataf1
結果:將大寫全換成小寫字母
tr '[a-z]' '[A-Z]' < dataf1
結果:將小寫全換成大寫字母
tr -s ' ' ' ' < dataf1
結果:將多餘的空白移除只剩一個 (-s 是壓擠的意思)
其它進一步的用法,請 man tr 查閱線上文件。
grep
用途:顯示符合樣式的列
用法:
grep A *
結果:將含有 A 這個字元的檔案及列顯示出來
grep -i A *
結果:將含有 A或a 這個字元的檔案及列顯示出來 (-i 是不分大小寫之意)
grep -v La data3
結果:將不含 La 的列顯示出來 (-v 是不包含之意)
grep -l La *
結果:只顯示那些檔案包含 La,不秀出符合的列
grep -n La *
結果:也秀出列號
dmesg | grep eth0
結果:將含有 eth0 的訊息列顯示出來
grep -q keyword filename
結果:若 filename 含有 keyword 則傳回 0 (真),否則傳為非 0
命令執行完之後,它的傳回值放在 $? 這個變數中,只要 echo $? 便可得知成功與否,請記住:0 為成功,非 0 為失敗 !
練習用的資料檔
dataf1 的內容:
John TNC 721 7654321
Marry TCC 678 1234567
Jack KCC 123 ABCDEFG
Bob PTC 345 efghijk
Anne TPC 987 1098643
dataf2 的內容:
Susan XXX 121 1AB57RT
Jeff AAA 478 JaBdkdk
Henry BBB 193 LaLaLaL
Allan DDD 621 Bobojto
Ken JJJ 094 sssssss
dataf3 的內容:
987 XXX 121 1AB57RT
234 AAA 478 JaBdkdk
765 BBB 193 LaLaLaL
512 DDD 621 Bobojto
363 JJJ 094 sssssss
765 BBB 193 LaLaLaL
dataf4的內容:
98
2341
7
51
363
常用的特殊字元
\b 後退
\f 跳頁
\n 換行字元
\r return
\t TAB
一個命令列執行好幾個命令
有二種方式:
每個命令之間用 ; 號隔開
如 ./configure ; make ; make install
每個命令之間用 && 號隔開
如 ./configure && make && make install
問題:這二者有何差別?
&& 表示前一個命令執行成功之後,才會接著執行下一個,這樣可讓我們確保所有的命令是否都成功執行。
這經常運用在自動安裝 script 檔中,以下是我平時使用的自動安裝 Apache 及 PHP 的 script 檔:
#! /bin/sh
tar xvzf apache*.gz &&
tar xvzf php*.gz &&
echo "Configure apache ...." &&
cd apache* &&
./configure --prefix=/usr/local/apache &&
cd .. &&
cd php* &&
./configure \
--with-apache=../apache_1.3.26 \
--with-mysql=/home/mysql &&
make &&
make install &&
cd .. &&
cd apache* &&
./configure \
--prefix=/usr/local/apache \
--activate-module=src/modules/php4/libphp4.a &&
make &&
make install &&
cd ../php* &&
cp -f php.ini-dist /usr/local/lib/php.ini
註: 若一列寫不完,可在該列末尾加上接續符號 \
註: 另有 || 的用法:如 命令1 || 命令2 || 命令3
|| 是或之意,當命令1執行成功時,就不會再往下執行,若命令1執行失敗,才會執行命命2
只有當前面二個命命都執行失敗,命令3 才會被執行
也可以把數個命令弄成一組,然後整組去執行它:
第一種方法:(命令1; 命令2; 命令3; ....)
( ) 會開啟一個子 shell 環境來執行括號中的命令組
以下是把一組命令放入背景中執行:
(sort mydata -o result.txt; procdata result.txt) &
第二種方法:{ 命令1; 命令2; 命令3; .... }
不同的是,此法是把這些命令組在現行的 shell 中執行,而非在子 shell 中執行
注意 { 右方、} 左方都要有空白,每個命令都要以 ';'這個符號結束
命令列郵寄帶檔的方法
以下是將 README 這個檔案郵件帶檔寄給 ols3@www.tnc.edu.tw
#! /bin/sh
# 由命令列寄帶檔的信件
# 方法 1: 使用 uuencode 編碼
例1
uuencode README README | mail -s "test attach msg file" ols3@www.tnc.edu.tw
上述的意思是說:把 README 這個檔案(第一個 README)予以 uuencode 編碼,且將 README (第二個 README) 這個名字寫入編碼檔的檔頭,再交給 mail 寄給收信者。
例2
uuencode nc11nt.zip nc11nt.zip | mail -s "test attach msg file" ols3@www.tnc.edu.tw
# 解碼法: uudecode 編碼檔
# 或由 OutLook Express 等讀取信件的程式自動解碼。
# ------------------------------------------------------------------------------
# 方法 2: 使用 base64 編碼
uuencode -m README README | mail -s "test attach msg file" ols3@www.tnc.edu.tw
# 解碼:
# uudecode 編碼檔
# 或
# uudecode 編碼檔 -o 指定輸出檔名
# 如 uudecode encode.txt -o nc11.zip
WinZip 也可以對 uuencode 編碼檔加以解碼,方法如下:
1. 把 uuencode 檔存為 .uue,若是 base64 編碼可存成 .b64
2. 用 WinZip 開啟編碼檔,即可按一般解壓動作來予以解碼。
=========================================================
# 註: uuencode 的用法例:
uuencode nc11nt.zip nc11nt.zip > p.txt
第一個檔名 nc11nt.zip 告訴 uuencode 要編碼的檔案是那一個,
第二個檔名 nc11nt.zip 是要 uuencode 把該檔名寫入 p.txt 表頭
它會在 p.txt 的第一列出現:
begin 600 nc11nt.zip
這樣子別人收到您的編碼檔,對方才知道您編碼之前的檔案格式為何?
因此,一般而言,uuencode 之後的二個檔名,我們都會弄成一樣。
p.txt 的內容截錄如下:
begin 600 nc11nt.zip
M4$L#!!0``@`(`.B88QW[!E;'=`<``)T2```(````9V5T;W!T+FC%5]MNXS@2
M?8X!_T-A%IA
M2T\'_4,Z_?3/3QE]^HCK%-<9KI]P_94NK90T,0O_**RD2U/K(AC,:*!S6.IV
MIJ6"=55)PO]K83V9!?E2TM7PEOITK>96V*1`/O:"6
MM\.[^E3%'1F5YE$^2(NM4[QXOK52#]*1TG2R+$Z6NC[!KN3.SLE\RH*C<"F*
M
MHJ*;>EZI'(]SJ9TDX;J=-3]RI2QH_A3VO87F.4F%]Y80KL,]G:63NIUD+R/D
M[T!X]MT2LHA5AW#XB2KA-QO?AF`3:<&PL3>E62.N$D81Z:.J*II+JIUM[6`I?1M,OXQNI]0;WM&WWGC<&T[OSK'4EP9OD9QH2*W6E8)=1&6%]D\AF5\O
MQOTOV-#[>7`]F-ZQ_Y>#Z?!B,J'+T9AZ=-,;3P?]V^O>F&YNQS>CR04R/9&R
M09AC?Q=BIO3*`,A">J$J%X*_0VX=W*L**L6#1(YS":X4)"@'Y;^?P19R$I71
MRQ#M2SZ?DTN>!NKW1S=W@^'5A^O!S\QTA*^-S^C1*C#+FW>3'TLIH[__XV_T
......省略
M`@`(`%9^1B0K8B6N!%\``%3Q```*``````````$`(`"V@50,`0!H;V)B:70N
M='AT4$L!`A0`%``"``@`H8Y&),B0K1B*"P``
end
==============================================================
用以下方法即可解碼回來:
uudecode p.txt -o nc11.zip
[精華] Grep 用法
Grep : g (globally) search for a re (regular expression ) and p (print ) the results.
1、參數:
-I :忽略大小寫
-c :列印匹配的行數
-l :從多個檔中查找包含匹配項
-v :查找不包含匹配項的行
-n:列印包含匹配項的行和行標
2、RE(正則運算式)
\ 忽略正則運算式中特殊字元的原有含義
^ 匹配正則運算式的開始行
$ 匹配正則運算式的結束行
\< 從匹配正則運算式的行開始
\>; 到匹配正則運算式的行結束
[ ] 單個字元;如[A] 即A符合要求
[ - ] 範圍 ;如[A-Z]即A,B,C一直到Z都符合要求
. 所有的單個字元
* 所有字元,長度可以為0
3、舉例
# ps -ef | grep in.telnetd
root 19955 181 0 13:43:53 ? 0:00 in.telnetd
# more size.txt size檔的內容
b124230
b034325
a081016
m7187998
m7282064
a022021
a061048
m9324822
b103303
a013386
b044525
m8987131
B081016
M45678
B103303
BADc2345
# more size.txt | grep '[a-b]' 範圍 ;如[A-Z]即A,B,C一直到Z都符合要求
b124230
b034325
a081016
a022021
a061048
b103303
a013386
b044525
# more size.txt | grep '[a-b]'*
b124230
b034325
a081016
m7187998
m7282064
a022021
a061048
m9324822
b103303
a013386
b044525
m8987131
B081016
M45678
B103303
BADc2345
# more size.txt | grep '' 單個字元;如[A] 即A符合要求
b124230
b034325
b103303
b044525
# more size.txt | grep '[bB]'
b124230
b034325
b103303
b044525
B081016
B103303
BADc2345
# grep 'root' /etc/group
root::0:root
bin::2:root,bin,daemon
sys::3:root,bin,sys,adm
adm::4:root,adm,daemon
uucp::5:root,uucp
mail::6:root
tty::7:root,tty,adm
lp::8:root,lp,adm
nuucp::9:root,nuucp
daemon::12:root,daemon
# grep '^root' /etc/group 匹配正則運算式的開始行
root::0:root
# grep 'uucp' /etc/group
uucp::5:root,uucp
nuucp::9:root,nuucp
# grep '\ uucp::5:root,uucp
# grep 'root$' /etc/group 匹配正則運算式的結束行
root::0:root
mail::6:root
# more size.txt | grep -i 'b1..*3' -i :忽略大小寫
b124230
b103303
B103303
# more size.txt | grep -iv 'b1..*3' -v :查找不包含匹配項的行
b034325
a081016
m7187998
m7282064
a022021
a061048
m9324822
a013386
b044525
m8987131
B081016
M45678
BADc2345
# more size.txt | grep -in 'b1..*3'
1:b124230
9:b103303
15:B103303
# grep '$' /etc/init.d/nfs.server | wc -l
128
# grep '\$' /etc/init.d/nfs.server | wc –l 忽略正則運算式中特殊字元的原有含義
15
# grep '\$' /etc/init.d/nfs.server
case "$1" in
>;/tmp/sharetab.$$
[ "x$fstype" != xnfs ] && \
echo "$path\t$res\t$fstype\t$opts\t$desc" \
>;>;/tmp/sharetab.$$
/usr/bin/touch -r /etc/dfs/sharetab /tmp/sharetab.$$
/usr/bin/mv -f /tmp/sharetab.$$ /etc/dfs/sharetab
if [ -f /etc/dfs/dfstab ] && /usr/bin/egrep -v '^[ ]*(#|$)' \
if [ $startnfsd -eq 0 -a -f /etc/rmmount.conf ] && \
if [ $startnfsd -ne 0 ]; then
elif [ ! -n "$_INIT_RUN_LEVEL" ]; then
while [ $wtime -gt 0 ]; do
wtime=`expr $wtime - 1`
if [ $wtime -eq 0 ]; then
echo "Usage: $0 { start | stop }"
# more size.txt
the test file
their are files
The end
# grep 'the' size.txt
the test file
their are files
# grep '\ the test file
their are files
# grep 'the\>;' size.txt
the test file
# grep '\;' size.txt
the test file
# grep '\<[Tt]he\>;' size.txt
the test file
The end
1、參數:
-I :忽略大小寫
-c :列印匹配的行數
-l :從多個檔中查找包含匹配項
-v :查找不包含匹配項的行
-n:列印包含匹配項的行和行標
2、RE(正則運算式)
\ 忽略正則運算式中特殊字元的原有含義
^ 匹配正則運算式的開始行
$ 匹配正則運算式的結束行
\< 從匹配正則運算式的行開始
\>; 到匹配正則運算式的行結束
[ ] 單個字元;如[A] 即A符合要求
[ - ] 範圍 ;如[A-Z]即A,B,C一直到Z都符合要求
. 所有的單個字元
* 所有字元,長度可以為0
3、舉例
# ps -ef | grep in.telnetd
root 19955 181 0 13:43:53 ? 0:00 in.telnetd
# more size.txt size檔的內容
b124230
b034325
a081016
m7187998
m7282064
a022021
a061048
m9324822
b103303
a013386
b044525
m8987131
B081016
M45678
B103303
BADc2345
# more size.txt | grep '[a-b]' 範圍 ;如[A-Z]即A,B,C一直到Z都符合要求
b124230
b034325
a081016
a022021
a061048
b103303
a013386
b044525
# more size.txt | grep '[a-b]'*
b124230
b034325
a081016
m7187998
m7282064
a022021
a061048
m9324822
b103303
a013386
b044525
m8987131
B081016
M45678
B103303
BADc2345
# more size.txt | grep '' 單個字元;如[A] 即A符合要求
b124230
b034325
b103303
b044525
# more size.txt | grep '[bB]'
b124230
b034325
b103303
b044525
B081016
B103303
BADc2345
# grep 'root' /etc/group
root::0:root
bin::2:root,bin,daemon
sys::3:root,bin,sys,adm
adm::4:root,adm,daemon
uucp::5:root,uucp
mail::6:root
tty::7:root,tty,adm
lp::8:root,lp,adm
nuucp::9:root,nuucp
daemon::12:root,daemon
# grep '^root' /etc/group 匹配正則運算式的開始行
root::0:root
# grep 'uucp' /etc/group
uucp::5:root,uucp
nuucp::9:root,nuucp
# grep '\
# grep 'root$' /etc/group 匹配正則運算式的結束行
root::0:root
mail::6:root
# more size.txt | grep -i 'b1..*3' -i :忽略大小寫
b124230
b103303
B103303
# more size.txt | grep -iv 'b1..*3' -v :查找不包含匹配項的行
b034325
a081016
m7187998
m7282064
a022021
a061048
m9324822
a013386
b044525
m8987131
B081016
M45678
BADc2345
# more size.txt | grep -in 'b1..*3'
1:b124230
9:b103303
15:B103303
# grep '$' /etc/init.d/nfs.server | wc -l
128
# grep '\$' /etc/init.d/nfs.server | wc –l 忽略正則運算式中特殊字元的原有含義
15
# grep '\$' /etc/init.d/nfs.server
case "$1" in
>;/tmp/sharetab.$$
[ "x$fstype" != xnfs ] && \
echo "$path\t$res\t$fstype\t$opts\t$desc" \
>;>;/tmp/sharetab.$$
/usr/bin/touch -r /etc/dfs/sharetab /tmp/sharetab.$$
/usr/bin/mv -f /tmp/sharetab.$$ /etc/dfs/sharetab
if [ -f /etc/dfs/dfstab ] && /usr/bin/egrep -v '^[ ]*(#|$)' \
if [ $startnfsd -eq 0 -a -f /etc/rmmount.conf ] && \
if [ $startnfsd -ne 0 ]; then
elif [ ! -n "$_INIT_RUN_LEVEL" ]; then
while [ $wtime -gt 0 ]; do
wtime=`expr $wtime - 1`
if [ $wtime -eq 0 ]; then
echo "Usage: $0 { start | stop }"
# more size.txt
the test file
their are files
The end
# grep 'the' size.txt
the test file
their are files
# grep '\
their are files
# grep 'the\>;' size.txt
the test file
# grep '\
the test file
# grep '\<[Tt]he\>;' size.txt
the test file
The end
訂閱:
文章 (Atom)