?? 8.htm
字號:
$ dos2unix <VAR>dosfile</VAR>
</PRE>
<HR>
<A name=s8.6.12></A>
<H3>8.6.12 正規(guī)表達(dá)式的置換</H3>
<P>將所有文件<VAR>FILES</VAR> ...中的所有<VAR>FROM_REGEX</VAR>字段替換成<VAR>TO_REGEX</VAR>字段。
<PRE> $ perl -i -p -e 's/<VAR>FROM_REGEX</VAR>/<VAR>TO_REGEX</VAR>/g;' <VAR>FILES</VAR> ...
</PRE>
<P><SAMP>-i</SAMP>表示“就地編輯”,<SAMP>-p</SAMP>表示“在<VAR>FILES</VAR>...各文件中循環(huán)”。如果置換很復(fù)雜,應(yīng)使用參數(shù)<SAMP>-i.bak</SAMP>而非<SAMP>-i</SAMP>,這有助于出錯恢復(fù);它會將每個原始文件保存為以<SAMP>.bak</SAMP>為后綴的備份文件。
<HR>
<A name=s8.6.13></A>
<H3>8.6.13 使用腳本來編輯文件</H3>
<P>下面的腳本將刪除5-10行以及16-20行。 <PRE> #!/bin/bash
ed $1 <<EOF
16,20d
5,10d
w
q
EOF
</PRE>
<P>在此,<CODE>ed</CODE>命令與<CODE>vi</CODE>命令模式下的是一樣的,從外部編輯文件的方式使它更適于腳本化。
<HR>
<A name=s8.6.14></A>
<H3>8.6.14 提取源文件修改部分合并到更新包</H3>
<P>下面的操作將根據(jù)文件位置,提取源文件的修改部分并創(chuàng)建統(tǒng)一的diff文件<VAR>file.patch0</VAR>或<VAR>file.patch1</VAR>:
<PRE> $ diff -u <VAR>file.old</VAR> <VAR>file.new1</VAR> > <VAR>file.patch0</VAR>
$ diff -u <VAR>old/file</VAR> <VAR>new1/file</VAR> > <VAR>file.patch1</VAR>
</PRE>
<P>diff文件(也稱補丁文件)通常用于發(fā)送程序更新。收到的補丁文件可使用下面的方法更新另一個<VAR>文件</VAR>: <PRE> $ patch -p0 <VAR>file</VAR> < <VAR>file.patch0</VAR>
$ patch -p1 <VAR>file</VAR> < <VAR>file.patch1</VAR>
</PRE>
<P>如果有3個版本的源代碼,使用<CODE>diff3</CODE>來合并效率更高: <PRE> $ diff3 -m <VAR>file.mine</VAR> <VAR>file.old</VAR> <VAR>file.yours</VAR> > <VAR>file</VAR>
</PRE>
<HR>
<A name=s8.6.15></A>
<H3>8.6.15 分割大文件</H3><PRE> $ split -b 650m <VAR>file</VAR> # 將大文件分塊成多個650MB的小文件
$ cat x* ><VAR>largefile</VAR> # 將所有小文件合并成一個大文件
</PRE>
<HR>
<A name=s8.6.16></A>
<H3>8.6.16 從文本格式的表格中抽取數(shù)據(jù)</H3>
<P>假設(shè)有一個文本文件名為<CODE>DPL</CODE>,其中存放著所有前Debian項目領(lǐng)導(dǎo)人的名字和他們的上臺日期,表格格式是以空格做為分隔的。 <PRE> Ian Murdock August 1993
Bruce Perens April 1996
Ian Jackson January 1998
Wichert Akkerman January 1999
Ben Collins April 2001
Bdale Garbee April 2002
Martin Michlmayr March 2003
</PRE>
<P>AWK經(jīng)常用于從這類數(shù)據(jù)中提取數(shù)據(jù)。 <PRE> $ awk '{ print $3 }' <DPL # month started
August
April
January
January
April
April
March
$ awk '($1=="Ian") { print }' <DPL # DPL called Ian
Ian Murdock August 1993
Ian Jackson January 1998
$ awk '($2=="Perens") { print $3,$4 }' <DPL # When Perens started
April 1996
</PRE>
<HR>
<A name=s8.6.17></A>
<H3>8.6.17 精巧的管道命令輔助腳本</H3>
<P>下列腳本做為管道的一部分十分有用。 <PRE> find /usr | egrep -v "/usr/var|/usr/tmp|/usr/local"
# find all files in /usr excluding some files
xargs -n 1 <VAR>command</VAR> # run command for all items from stdin
xargs -n 1 echo | # split white-space-separated items into lines
xargs echo | # merge all lines into a line
grep -e <VAR>pattern</VAR>| # extract lines containing <VAR>pattern</VAR>
cut -d: -f3 -|
# extract third field separated by : (passwd file etc.)
awk '{ print $3 }' | # extract third field separated by whitespaces
awk -F'\t' '{ print $3 }' |
# extract third field separated by tab
col -bx | # remove backspace and expand tabs to spaces
expand -| # expand tabs
sort -u| # sort and remove duplicates
tr '\n' ' '| # concatenate lines into one line
tr '\r' ''| # remove CR
tr 'A-Z' 'a-z'| # convert uppercase to lowercase
sed 's/^/# /'| # make each line a comment
sed 's/\<VAR>.ext</VAR>//g'| # remove <VAR>.ext</VAR>
sed -n -e 2p| # print the second line
head -n 2 -| # print the first 2 lines
tail -n 2 -| # print the last 2 lines
</PRE>
<HR>
<A name=s8.6.18></A>
<H3>8.6.18 短小的Perl腳本</H3>
<P>任何Awk腳本均可使用Perl重寫,例如 <PRE> awk '($2=="1957") { print $3 }' |
</PRE>
<P>可以使用下列任意一行實現(xiàn): <PRE> perl -ne '@f=split; if ($f[1] eq "1957") { print "$f[2]\n"}' |
perl -ne 'if ((@f=split)[1] eq "1957") { print "$f[2]\n"}' |
perl -ne '@f=split; print $f[2] if ( $f[1]==1957 )' |
perl -lane 'print $F[2] if $F[1] eq "1957"' |
</PRE>
<P>其實上面各行中所有perl參數(shù)中的空格均可去掉,這得益于Perl的數(shù)字字符串自動轉(zhuǎn)換功能。 <PRE> perl -lane 'print$F[2]if$F[1]eq+1957' |
</PRE>
<P>有關(guān)命令行參數(shù)的信息可參閱<CODE>perlrun(1)</CODE>,在<CODE><A
href="http://perlgolf.sourceforge.net/">http://perlgolf.sourceforge.net/</A></CODE>有更多令人著魔的Perl腳本,你會感興趣的。
<HR>
<A name=s8.6.19></A>
<H3>8.6.19 從網(wǎng)頁上獲取文本或郵件列表文檔</H3>
<P>下面的操作將網(wǎng)頁轉(zhuǎn)化為文本文件。從網(wǎng)上拷貝配置文件時十分有用。 <PRE> $ lynx -dump http://<VAR>www.remote-site.com/help-info.html</VAR> ><VAR>textfile</VAR>
</PRE>
<P><CODE>links</CODE>和<CODE>w3m</CODE>也可以這么用,只是生成的文本樣式可能略有不同。
<P>如果是郵件列表文檔,可使用<CODE>munpack</CODE>從文本獲得mime內(nèi)容。
<HR>
<A name=s8.6.20></A>
<H3>8.6.20 打印網(wǎng)頁</H3>
<P>下面的操作將網(wǎng)頁內(nèi)容打印成PostScript文件或發(fā)送到打印機。 <PRE> $ apt-get install html2ps
$ html2ps <VAR>URL</VAR> | lpr
</PRE>
<P>參閱<A
href="http://qref.sourceforge.net/Debian/reference/ch-install.zh-cn.html#s-lprlpd"><CODE>lpr</CODE>/<CODE>lpd</CODE>,
第 3.6.1 節(jié)</A>。還可使用<CODE>a2ps</CODE>和<CODE>mpage</CODE>軟件包生成PostScript文件。
<HR>
<A name=s8.6.21></A>
<H3>8.6.21 打印幫助頁面</H3>
<P>下面的操作將幫助頁面打印成PostScript文件或發(fā)送到打印機。 <PRE> $ man -Tps <VAR>some-man-page</VAR> | lpr
$ man -Tps <VAR>some-man-page</VAR> | mpage -2 | lpr
</PRE>
<HR>
<A name=s8.6.22></A>
<H3>8.6.22 合并兩個Postscript或PDF文件</H3>
<P>可以將兩個Postscript文件或PDF文件合并。 <PRE> $ gs -q -dNOPAUSE -dBATCH -sDEVICE=pswrite \
-sOutputFile=<VAR>bla.ps</VAR> -f <VAR>foo1.ps</VAR> <VAR>foo2.ps</VAR>
$ gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite \
-sOutputFile=<VAR>bla.pdf</VAR> -f <VAR>foo1.pdf</VAR> <VAR>foo2.pdf</VAR>
</PRE>
<HR>
<A name=s8.6.23></A>
<H3>8.6.23 命令耗時</H3>
<P>顯示某進(jìn)程的耗時 <PRE> # time <VAR>some-command</VAR> >/dev/null
real 0m0.035s # time on wall clock (elapsed real time)
user 0m0.000s # time in user mode
sys 0m0.020s # time in kernel mode
</PRE>
<HR>
<A name=s8.6.24></A>
<H3>8.6.24 <CODE>nice</CODE>命令</H3>
<P>使用<CODE>nice</CODE>(來自GNU
<CODE>shellutils</CODE>軟件包)可設(shè)置命令啟動時的nice值。<CODE>renice</CODE>(<CODE>bsdutils</CODE>)或<CODE>top</CODE>可以重設(shè)進(jìn)程的nice值。nice值為19代表最慢的(優(yōu)先級最低的)進(jìn)程;負(fù)值就“not-nice”,如-20代表非常快的(優(yōu)先級高的)進(jìn)程。只有超級用戶可以設(shè)定負(fù)nice值。
<PRE> # nice -19 <VAR>top</VAR> # very nice
# nice --20 <VAR>cdrecord -v -eject speed=2 dev=0,0 disk.img</VAR> # very fast
</PRE>
<P>有時極端的nice值對系統(tǒng)弊大于利,所以使用該命令要小心。
<HR>
<A name=s-cronjob></A>
<H3>8.6.25 日程安排(<CODE>cron</CODE>,<CODE>at</CODE>)</H3>
<P>在Linux下使用<CODE>cron</CODE>和<CODE>at</CODE>進(jìn)行任務(wù)日程安排。參閱<CODE>at(1)</CODE>、<CODE>crontab(5)</CODE>、<CODE>crontab(8)</CODE>。
<P>執(zhí)行命令<SAMP>crontab
-e</SAMP>創(chuàng)建或編輯crontab文件,為規(guī)律事務(wù)(按周期循環(huán)的事務(wù))安排日程。下面的一個crontab文件樣例: <PRE> # use /bin/sh to run commands, no matter what /etc/passwd says
SHELL=/bin/sh
# mail any output to `paul', no matter whose crontab this is
MAILTO=paul
# Min Hour DayOfMonth Month DayOfWeek command (Day... are OR'ed)
# run at 00:05, every day
5 0 * * * $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
# run at 14:15 on the first of every month -- output mailed to paul
15 14 1 * * $HOME/bin/monthly
# run at 22:00 on weekdays(1-5), annoy Joe. % for newline, last % for cc:
0 22 * * 1-5 mail -s "It's 10pm" joe%Joe,%%Where are your kids?%.%%
23 */2 1 2 * echo "run 23 minutes after 0am, 2am, 4am ..., on Feb 1"
5 4 * * sun echo "run at 04:05 every sunday"
# run at 03:40 on the first Monday of each month
40 3 1-7 * * [ "$(date +%a)" == "Mon" ] && command -args
</PRE>
<P>執(zhí)行<CODE>at</CODE>命令為偶然任務(wù)(只執(zhí)行一次的任務(wù))安排日程: <PRE> $ echo '<VAR>command -args</VAR>'| at 3:40 monday
</PRE>
<HR>
<A name=s-screen></A>
<H3>8.6.26 用<CODE>screen</CODE>來定制控制臺</H3>
<P>The
<CODE>screen</CODE>程序允許在<STRONG>單一</STRONG>的物理終端或終端模擬窗口運行<STRONG>多個</STRONG>偽終端,每個偽終端都擁有自己的交互式shell。即便可以使用Linux偽終端或多個xterm窗口,研究一下如何設(shè)置<CODE>screen</CODE><STRONG>豐富的特性</STRONG>仍很有益,這些特性包括:
<UL>
<LI>回溯歷史顯示,
<LI>拷貝和粘貼,
<LI>輸出到日志,
<LI>圖形入口,
<LI>將終端與整個<CODE>screen</CODE>會話<STRONG>分離</STRONG>,稍后再連接。 </LI></UL>
<HR>
<A name=s8.6.26.1></A>
<H4>8.6.26.1 遠(yuǎn)程訪問方案</H4>
<P>If you frequently log on to a Linux machine
如果你經(jīng)常從遠(yuǎn)程終端登錄到Linux機器或使用VT100終端程序,<CODE>screen</CODE>的<STRONG>detach</STRONG>(分離)特性將簡化你的生活。
<OL type=1>
<LI>通過拔號連接登錄,運行了一個非常復(fù)雜的<CODE>screen</CODE>會談,打開了好幾個窗口,有編輯器和其它一些程序。
<LI>突然你需要離開終端一下,但你并不想掛斷連接中止工作。
<LI>輸入<SAMP>^A d</SAMP><STRONG>離開</STRONG>會話,然后登出系統(tǒng)。(或者更簡單些,輸入<SAMP>^A
DD</SAMP>離開會話并自動登出系統(tǒng))
<LI>當(dāng)你回來時,需要再次登錄,可輸入命令<SAMP>screen
-r</SAMP>,<CODE>screen</CODE>會如魔法般地重新連接上所有打開的窗口。 </LI></OL>
<HR>
<A name=s8.6.26.2></A>
<H4>8.6.26.2 典型的<CODE>screen</CODE>命令</H4>
<P>一但打開了<CODE>screen</CODE>程序,除了命令按鍵(默認(rèn)為<SAMP>^A</SAMP>)所有的鍵盤輸入都被送到當(dāng)前窗口,所有的<CODE>screen</CODE>命令均按特定方式輸入:<SAMP>^A</SAMP>加一個單鍵命令[加一些參數(shù)]的。常用的命令有:
<PRE> ^A ? 顯示幫助屏幕(顯示命令集)
^A c 創(chuàng)建并切換到新窗口
^A n 跳到下一個窗口
^A p 跳到上一個窗口
^A <VAR>0</VAR> 跳到<VAR>0</VAR>號窗口
^A w 顯示窗口列表
^A a 將Ctrl-A做為鍵盤輸入發(fā)送到當(dāng)前窗口
^A h 對當(dāng)前窗口做硬拷貝寫入到文件
^A H 開始/中止將當(dāng)前窗口事件記錄到文件
^A ^X 鎖定終端(密碼保護(hù))
^A d 從終端分離屏幕會話
^A DD 分離屏幕會話并退出登錄
</PRE>
<P>以上只是<CODE>screen</CODE>命令的一個很小的子集。只要是你認(rèn)為<CODE>screen</CODE>能干的事,沒準(zhǔn)它真就可以!詳情參閱<CODE>screen(1)</CODE>。
<HR>
<A name=s8.6.26.3></A>
<H4>8.6.26.3 <CODE>screen</CODE>會話中的退格鍵和Ctrl-H</H4>
<P>在運行<CODE>screen</CODE>時,如果發(fā)現(xiàn)退格鍵和/或Ctrl-H無法正常工作,可編輯<CODE>/etc/screenrc</CODE>,找到這行:
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -