??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品美女久久久久网,伊人久久精品无码av一区,久久久久无码精品http://www.shnenglu.com/beautykingdom/category/8562.htmlzh-cnThu, 07 Jul 2011 15:01:15 GMTThu, 07 Jul 2011 15:01:15 GMT60shell?+?00http://www.shnenglu.com/beautykingdom/archive/2010/10/28/131607.htmlchatlerchatlerThu, 28 Oct 2010 03:12:00 GMThttp://www.shnenglu.com/beautykingdom/archive/2010/10/28/131607.htmlhttp://www.shnenglu.com/beautykingdom/comments/131607.htmlhttp://www.shnenglu.com/beautykingdom/archive/2010/10/28/131607.html#Feedback0http://www.shnenglu.com/beautykingdom/comments/commentRss/131607.htmlhttp://www.shnenglu.com/beautykingdom/services/trackbacks/131607.htmlW一U方法:
 #!/bin/bash
echo -e "\t${!#}"
for (( i = 0; i < 100; i++ ))
do
        result=$[ ${result} + ${i} ]
done
echo $result
W二U方法:
seq -s"+" 1 100|bc
W三U方法:
s=0
for ((i=1;i<=100;i++)) ; do
    s=`expr $s + $i`
done
echo $s
W四U方法:
#!/bin/sh
s=0
for i in `seq 1 100`
do
s=`expr $s + $i`
done
echo $s

W五U方法:
echo {1..100}|sed 's/ /+/g'|bc


fromQ?br>http://bbs.chinaunix.net/thread-1777298-1-1.html


chatler 2010-10-28 11:12 发表评论
]]>
文本qo工具GREPhttp://www.shnenglu.com/beautykingdom/archive/2010/06/01/116859.htmlchatlerchatlerTue, 01 Jun 2010 01:48:00 GMThttp://www.shnenglu.com/beautykingdom/archive/2010/06/01/116859.htmlhttp://www.shnenglu.com/beautykingdom/comments/116859.htmlhttp://www.shnenglu.com/beautykingdom/archive/2010/06/01/116859.html#Feedback0http://www.shnenglu.com/beautykingdom/comments/commentRss/116859.htmlhttp://www.shnenglu.com/beautykingdom/services/trackbacks/116859.html 传统?grep E序, 在没有参数的情况? 只输出符?RE 字符串之句子. 常见参数如下:
-v: 逆反模示, 只输?不含" RE 字符串之句子.
-r: 递归模式, 可同时处理所有层U子目录里的文g.
-q: 静默模式, 不输ZQ何结?stderr 除外. 常用以获?return value, W合?true, 否则?false .)
-i: 忽略大小?
-w: 整词比对, cM \<word\> .
-n: 同时输出行号.
-c: 只输出符合比对的行数.
-l: 只输出符合比对的文g名称.
-o: 只输出符?RE 的字W串. (gnu 新版独有, 不见得所有版本都支持.)
-E: 切换?egrep .

* egrep:
?grep 的扩充版? 改良了许多传l?grep 不能或不便的操作. 比方?
- grep 之下不支?? ?+ q两U?modifier, ?egrep 则可.
- grep 不支?a|b ?(abc|xyz) q类"或一"比对, ?egrep 则可.
- grep 在处?{n,m} ? 需?\{ ?\} 处理, ?egrep 则不需.
诸如此类?.. 我个Z能用 egrep ׃?grep ?.. ^_^

* fgrep:
不作 RE 处理, 表达式仅作一般字W串处理, 所?meta 均失d?

单引号双引号
在g r e p命o中输入字W串参数Ӟ最好将其用双引hh?/strong>
在调用模式匹配时Q应使用单引受?/strong>

开始讨Z前,先生成一个文Ӟ插入一D|本,q在每列后加?lt; Ta b >键,g r e p命oCZ中绝大多数将以此ZQ其命名为d a t a . . f。生成一个文Ӟd a t a . f的记录结构如下:



QUOTE:
W?列:城市位置~号?br> W?列:月䆾?br> W?列:存储代码及出库年份?br> W?列:产品代号?br> W?列:产品l一标h?br> W?列:标识受?br> W?列:合格数量?/div>



文g内容如下Q?/strong>
  1. $ cat data.f
  2. 48      Dec     3BC1977 LPSX    68.00   LVX2A   138
  3. 483     Sept    5AP1996 USP     65.00   LVX2C   189
  4. 47      Oct     3ZL1998 LPSX    43.00   KVM9D   512
  5. 219     dec     2CC1999 CAD     23.00   PLV2C   68
  6. 484     nov     7PL1996 CAD     49.00   PLV2C   234
  7. 483     may     5PA1998 USP     37.00   KVM9D   644
  8. 216     sept    3ZL1998 USP     86.00   KVM9E   234

1、查询多个文?/strong>
在所有文件中查询单词“ sort it”
  1. $ grep "sort it" *


2?行匹?/strong>
1)昄包含“4 8”字符串的文本Q?br>
  1. $ grep  "48"data.f


2)输出匚w行的L
  1. $ grep -c "48"data.f
  2. 4

g r e pq回数字4Q表C:包含字符?#8220;4 8”的有4行?br>
3)行数
昄满匚w模式的所有行行数Q?br>
  1. $ grep -n "48"data.f

行数在输出第一列,后跟包含4 8的每一匚w行?br>
4)昄非匹配行
昄所有不包含4 8的各?br>
  1. $ grep -v "48"data.f

5)_匚w
可能大家已注意到Q在上一例中Q抽取字W串“ 4 8”Q返回结果包含诸? 8 4? 8 3{包?#8220;4 8”的其他字W串Q实际上应精抽取只包含4 8的各行?br> 使用g r e p抽取_匚w的一U更有效方式是在抽取字符串后加\ >。假定现在精抽? 8Q方法如下:
  1. $grep "48\>" data.f

QUOTE:
另一U方法我试过Q好像不行:
注意在每个匹配模式中抽取字符串后有一?lt; Ta b >键,所以应操作如下Q?br> < Ta b >表示点击t a b键?br> $grep "48<tab>" data.f

6)大小写敏?/strong>
~省情况下, g r e p是大写敏感的,如要查询大小写不敏感字符Ԍ必须使用- i开兟뀂在d a t a . f文g中有月䆾字符S e p tQ既有大写也有小写,要取得此字符串大写不敏感查询,Ҏ如下Q?br>
  1. $grep -i "48" data.f

grep和正则表辑ּ

使用正则表达式模式匚w加入一些规则,因此可以在抽取信息中加入更多选择。用正则表辑ּ时最好用单引hhQ这样可以防止g r e p中用的专有模式与一些s h e l l命o的特D方式相h?br>                                                                               
1、模式范?/strong>
抽取代码? 8 4? 8 3的城市位|,可以使用[ ]来指定字W串范围?br>
  1. $ grep "48[34]" data.f
  2. 483     Sept    5AP1996 USP     65.00   LVX2C   189
  3. 484     nov     7PL1996 CAD     49.00   PLV2C   234
  4. 483     may     5PA1998 USP     37.00   KVM9D   644                                                                       
2、不匚w行首
使行首不??Q可以在Ҏ号中使用^记号?br>
  1. $ grep "^[^48]" data.f
  2. 219     dec     2CC1999 CAD     23.00   PLV2C   68
  3. 216     sept    3ZL1998 USP     86.00   KVM9E   234
如果是字W串48
  1. $ grep -v "^[^48]" data.f                                                                             
3、设|大写
使用- i开兛_以屏蔽月份S e p t的大写敏感
  1. [sam@chenwy sam]$ grep -i "sept" data.f
  2. 483     Sept    5AP1996 USP     65.00   LVX2C   189
  3. 216     sept    3ZL1998 USP     86.00   KVM9E   234                                                                            
也可以用另一U方式[ ]模式抽取各行包含S e p t和s e p t的所有信息?br>
  1. [sam@chenwy sam]$ grep '[sS]ept' data.f
如果要抽取包含S e p t的所有月份,不管其大写Qƈ且此行包含字W串483Q可以用管道命令,即符?#8220;|”左边命o的输Z?#8220; |”双命o的输入。D例如下:
  1. [sam@chenwy sam]$ grep '[sS]ept' data.f | grep 48
  2. 483     Sept    5AP1996 USP     65.00   LVX2C   189
不必文件名攑֜W二个g r e p命o中,因ؓ其输入信息来自于W一个g r e p命o的输?br>                                                                               
4、匹配Q意字W?/strong>
如果抽取以K开_以Dl尾的所有代码,可用下q方法,因ؓ已知代码长度?个字W:
  1. [sam@chenwy sam]$ grep 'K...D' data.f
  2. 47      Oct     3ZL1998 LPSX    43.00   KVM9D   512
  3. 483     may     5PA1998 USP     37.00   KVM9D   644                                                                             
上qC码做d改变Q头两个是大写字母,中间两个LQƈ以Cl尾Q?br>
  1. [sam@chenwy sam]$ grep '[A-Z]..C' data.f
  2. 483     Sept    5AP1996 USP     65.00   LVX2C   189
  3. 219     dec     2CC1999 CAD     23.00   PLV2C   68
  4. 484     nov     7PL1996 CAD     49.00   PLV2C   234
5、日期查?/strong>
一个常用的查询模式是日期查询。先查询所有以5开始以1 9 9 6? 9 9 8l尾的所有记录。用模? . . 1 9 9 [ 6 , 8 ]。这意味着W一个字Wؓ5Q后跟两个点Q接着? 9 9Q剩余两个数字是6??br>
  1. [sam@chenwy sam]$ grep '5..199[6,8]' data.f
  2. 483     Sept    5AP1996 USP     65.00   LVX2C   189
  3. 483     may     5PA1998 USP     37.00   KVM9D   644                                                                             
6、范围组?/strong>
必须学会使用[ ]抽取信息。假定要取得城市代码Q第一个字Wؓ0-9Q第二个字符??之间Q第三个字符??之间Q用下列模式即可实现?br>
  1. [sam@chenwy sam]$ grep '[0-9][0-5[0-6]' data.f
  2. 48      Dec     3BC1977 LPSX    68.00   LVX2A   138
  3. 483     Sept    5AP1996 USP     65.00   LVX2C   189
  4. 47      Oct     3ZL1998 LPSX    43.00   KVM9D   512
  5. 219     dec     2CC1999 CAD     23.00   PLV2C   68
  6. 484     nov     7PL1996 CAD     49.00   PLV2C   234
  7. 483     may     5PA1998 USP     37.00   KVM9D   644
  8. 216     sept    3ZL1998 USP     86.00   KVM9E   234                                                                             
q里q回很多信息Q有惌的,也有不想要的。参照模式,q回l果是正的Q因此这?br>
  1. [sam@chenwy sam]$ grep '^[0-9][0-5][0-6]' data.f
  2. 219     dec     2CC1999 CAD     23.00   PLV2C   68
  3. 216     sept    3ZL1998 USP     86.00   KVM9E   234
q样可以q回一个预期的正确l果?br>                                                                        ? 下要注意有无边界字符的区?      
7、模式出现机?/strong>
抽取包含数字4臛_重复出现两次的所有行Q方法如下:
  1. [sam@chenwy sam]$ grep '4\{2,\}' data.f
  2. 483     may     5PA1998 USP     37.00   KVM9D   644
上述语法指明数字4臛_重复出现两次Q注意有无边 界字W的区别?nbsp;                                                                             
同样Q抽取记录之包含数? 9 9Q三?Q,Ҏ如下Q?br>
  1. [sam@chenwy sam]$ grep '9\{3,\}' data.f
  2. 219     dec     2CC1999 CAD     23.00   PLV2C   68
                                                                              
如果要查询重复出现次C定的所有行Q语法如下,数字9重复出现两次或三ơ:
  1. [sam@chenwy sam]$ grep '9\{3\}' data.f
  2. 219     dec     2CC1999 CAD     23.00   PLV2C   68
  3. [sam@chenwy sam]$ grep '9\{2\}' data.f
  4. 483     Sept    5AP1996 USP     65.00   LVX2C   189
  5. 47      Oct     3ZL1998 LPSX    43.00   KVM9D   512
  6. 219     dec     2CC1999 CAD     23.00   PLV2C   68
  7. 484     nov     7PL1996 CAD     49.00   PLV2C   234                                                                            
有时要查询重复出现次数在一定范围内Q比如数字或字母重复出现2?ơ,下例匚w数字8重复出现2?ơ,q以3l尾Q?br>
  1. [sam@chenwy sam]$ cat myfile
  2. 83
  3. 888883
  4. 8884
  5. 88883
  6. [sam@chenwy sam]$ grep '8\{2,6\}3' myfile
  7. 888883
  8. 88883                                                                            
8、用grep匚w“?#8221;或?#8220;?#8221;模式
g r e p命o? E参数Q这一扩展允许使用扩展模式匚w。例如,要抽取城市代码ؓ2 1 9? 1 6Q方法如下:
  1. [sam@chenwy sam]$ grep -E '219|216' data.f
  2. 219     dec     2CC1999 CAD     23.00   PLV2C   68
  3. 216     sept    3ZL1998 USP     86.00   KVM9E   234                                                                             
9、空?/strong>
l合使用^?可查询空行。? c参数昄总行敎ͼ
  1. [sam@chenwy sam]$ grep -c '^$' myfile
使用- n参数昄实际在哪一行:
  1. [sam@chenwy sam]$ grep -c '^$' myfile
10、匹配特D字W?/strong>
查询有特D含义的字符Q诸? . ' " * [] ^ | \ + ? ,必须在特定字W前加\。假设要查询包含“.”的所有行Q脚本如下:
  1. [sam@chenwy sam]$ grep '\.' myfile
或者是一个双引号Q?br>
  1. [sam@chenwy sam]$ grep '\"' myfile                                                                            
以同L方式Q如要查询文件名c o n f t r o l l . c o n fQ这是一个配|文ӞQ脚本如下:
  1. [sam@chenwy sam]$ grep 'conftroll\.conf' myfile                                                                             
11、查询格式化文g?/strong>
使用正则表达式可匚wL文g名。系l中Ҏ本文件有其标准的命名格式。一般最多六个小写字W,后跟句点Q接着是两个大写字W?br>
  1. [sam@chenwy sam]$ grep '^[a-z]\{1,6\}\.[A-Z]\{1,2\}' filename
q个写法我不知道有没有错 :oops:  :oops:  :oops:
                                                                              
12 查询IP地址
要查看n n n . n n n|络地址Q如果忘了第二部分中的其余部分,只知有两个句点,例如n n n . n n . .。要抽取其中所有nnn.nnn IP地址Q用[ 0 - 9 ] \ { 3 \ } \ . [ 0 - 0 \ { 3 \ } \。含义是L数字出现3ơ,后跟句点Q接着是Q意数字出?ơ,后跟句点?br>
  1. [0-9]\{3\}\.[0-9]\{3\}\.'

shell基础八:文本qo工具QgrepQ?/h2> 1、类?/strong>

g r e p允许使用国际字符模式匚w或匹配模式的cd形式?br> cd及其{h的正则表辑ּcȝL正则表达式类{h的正则表辑ּ


QUOTE:
[ [ : u p p e r : ] ] [ A - Z ] [ [ : a l n u m : ] ] [ 0 - 9 a - zA-Z]
[ [ : l o w e r : ] ] [ a - z ] [ [ : s p a c e : ] ] I格或t a b?br> [ [ : d i g i t : ] ] [ 0 - 9 ] [ [ : a l p h a : ] ] [ a - z A - Z ]



例一Q取?开_后跟臛_两个大写字母Q?br>
  1. $grep '5[[:upper:]][[:upper]]' data.f

取以P或Dl尾的所有品代码:
  1. grep '[[:upper:]][[:upper:]][P,D]' data.f
2、用通配W?的匹配模?/strong>
  1. $cat testfile
  2. looks
  3. likes
  4. looker
  5. long
试试如下Q?br>
  1. grep "l.*s" testfile
如在行尾查询某一单词Q试如下模式Q?br>
  1. grep "ng$" testfile
q将在所有文件中查询行尾包含单词ng的所有行?br>
3、系lgrep

文gpasswd
  1. [root@Linux_chenwy sam]# grep "sam" /etc/passwd
  2. sam:x:506:4::/usr/sam:/bin/bash
上述脚本查询/ e t c / p a s s w d文g是否包含sam字符?br>
如果误输入以下脚本:
  1. [root@Linux_chenwy sam]# grep "sam" /etc/password
  2. grep: /etc/password: 没有那个文g或目?/li>
返回g r e p命o错误代码'No such file or directory'?br> 上述l果表明输入文g名不存在Q用g r e p命o- s开养I可屏蔽错误信息?br> q回命o提示W,而没有文件不存在的错误提C?br>
  1. [root@Linux_chenwy sam]# grep -s "sam" /etc/password
如果g r e p命o不支? s开养I可替代用以下命令:
  1. [root@Linux_chenwy sam]# grep "sam" /tec/password >/dev/null 2>&1
脚本含义是匹配命令输出或错误Q?2 > $ 1Q,q将l果输出到系l池。大多数pȝ理员称/ d e v / n u l l为比ҎQ没关系Q可以将之看成一个无底洞Q有q没有出Q永q也不会填满?br>
上述两个例子q不好Q因里的目的只想知道查询是否成功?br>
如要保存g r e p命o的查询结果,可将命o输出重定向到一个文件?br>
  1. [root@Linux_chenwy sam]# grep "sam" /etc/passwd >/usr/sam/passwd.out
  2. [root@Linux_chenwy sam]# cat /usr/sam/passwd.out
  3. sam:x:506:4::/usr/sam:/bin/bash
脚本输出重定向到目? t m p下文件p a s s w d . o u t中?br>
使用ps命o
使用带有ps x命o的g r e p可查询系l上q行的进E。ps x命o意ؓ昄pȝ上运行的所有进E列表。要查看D N S服务器是否正在运行(通常UCؓn a m e dQ,Ҏ如下Q?br>
  1. [root@Linux_chenwy sam]# ps ax|grep "named"
  2. 2897 pts/1    S      0:00 grep named
输出也应包含此g r e p命oQ因为g r e p命o创徏了相应进E, ps x找到它。在g r e p命o中? v选项可丢弃p s命o中的g r e pq程。如果ps x不适用于用Ll,替代使用ps -ef。这里,׃我没有DNS服务Q因而只有grepq程?br>
对一个字W串使用grep
g r e p不只应用于文Ӟ也可应用于字W串。ؓ此用e c h o字符串命令,然后对g r e p命o使用道输入?br>
  1. [root@Linux_chenwy sam]# STR="Mary Joe Peter Pauline"
  2. [root@Linux_chenwy sam]# echo $STR | grep "Mary"
  3. Mary Joe Peter Pauline
匚w成功实现?br>
  1. [root@Linux_chenwy sam]# echo $STR | grep "Simon"
因ؓ没有匚w字符Ԍ所以没有输出结果?br>
4、egrep
e g r e p代表e x p r e s s i o n或extended grepQ适情况而定。e g r e p接受所有的正则表达式, e g r e p的一个显著特性是可以以一个文件作Z存的字符Ԍ然后之传给e g r e p作ؓ参数Qؓ此? f开兟뀂如果创Z个名为g r e p s t r i n g s的文Ӟq输? 8 4? 7Q?br>
  1. [root@Linux_chenwy sam]# vi grepstrings
  2. [root@Linux_chenwy sam]# cat grepstrings
  3. 484
  4. 47

  1. [root@Linux_chenwy sam]# egrep -f grepstrings data.f
  2. 47      Oct     3ZL1998 LPSX    43.00   KVM9D   512
  3. 484     nov     7PL1996 CAD     49.00   PLV2C   234
上述脚本匚wd a t a . f中包? 8 4? 7的所有记录。当匚w大量模式Ӟ - f开兛_有用Q而在一个命令行中敲入这些模式显然极为繁琐?br>
如果要查询存储代? 2 L? C CQ可以用(|Q符P意即“|”W号两边之一或全部?br>
  1. [root@Linux_chenwy sam]# egrep '(3ZL|2CC)' data.f
  2. 47      Oct     3ZL1998 LPSX    43.00   KVM9D   512
  3. 219     dec     2CC1999 CAD     23.00   PLV2C   68
  4. 216     sept    3ZL1998 USP     86.00   KVM9E   234
可以使用L多竖U符“ |”Q例如要查看在系l中是否有帐号l o u i s e、m a t t y或pauline Q用w h o命oq管道输e g r e p?br>
  1. $who |egrep (louise|matty|pauline)
q可以用^W号排除字符丌Ӏ如果要查看pȝ上的用户Q但不包括m a t t y和p a u l i n eQ方法如下:
  1. $who |egrep -v '^(matty|pauline)'
如果要查询一个文件列表,包括s h u t d o w n、s h u t d o w n s、r e b o o t和r e b o o t sQ用e g r e p可容易地实现?br>
  1. $egrep '(shutdown |reboot) (s)?' *

fromQ?br>http://bbs.chinaunix.net/thread-446683-1-1.html


chatler 2010-06-01 09:48 发表评论
]]>史上最强bash函数?/title><link>http://www.shnenglu.com/beautykingdom/archive/2010/05/03/114291.html</link><dc:creator>chatler</dc:creator><author>chatler</author><pubDate>Mon, 03 May 2010 14:42:00 GMT</pubDate><guid>http://www.shnenglu.com/beautykingdom/archive/2010/05/03/114291.html</guid><wfw:comment>http://www.shnenglu.com/beautykingdom/comments/114291.html</wfw:comment><comments>http://www.shnenglu.com/beautykingdom/archive/2010/05/03/114291.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/beautykingdom/comments/commentRss/114291.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/beautykingdom/services/trackbacks/114291.html</trackback:ping><description><![CDATA[<pre>## ---------------------------------------------------------<br>## common functions<br>## author: samli AT tencent.com | huanlf AT gmail.com<br>## usage: source "./func-common.sh"<br>## last mod: 2009-07-10<br>## ---------------------------------------------------------<br><br><br><br><br><br><br>## ---------------- classical usage ------------------------<br>## export WORKDIR=$( cd ` dirname $0 ` && pwd )<br>## <br>## if [[ ! -r "$WORKDIR/func-common.sh" ]]; then<br>## echo "[$WORKDIR/func-common.sh] NOT FOUND"<br>## exit 1<br>## fi<br>## <br>## . "$WORKDIR/func-common.sh" || exit 1<br>## <br>## cd "$WORKDIR" || exit 1<br>## ---------------------------------------------------------<br><br><br><br><br><br><br>## set -x <br>## set -e ## Sorry, can not set -e here, fix later<br><br>## -------------------- GLOBAL VAR -------------------------<br><br>## some vars initialized in the end of this file, check it<br><br>## make sure we will find commands needed<br>export PATH=/sbin:/usr/sbin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:$PATH<br><br>## just a var to keep the val from get_localip<br>## use a strange var name to avoid collision<br>export LLLOCALIP<br><br>## the dir we are working in<br>export WORKDIR<br><br>## some addictional logs may redirected to here<br>## such as: make >> $LLLOG && make install >> $LLLOG<br>## use a strange var name to avoid collision<br>export LLLOG<br>export LLLOGDIR<br><br>## set locale as POSIX, to work around with i180-ed apps<br>export LANG=C<br>export LC_ALL=C<br><br>## set umask to 022 to avoid wrong access mode<br>umask 022<br><br>## ---------------------------------------------------------<br><br><br><br><br><br><br>## -------------------- colourful print --------------------<br><br>## ANSI Foreground color codes:<br>## 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white 39=default<br>## ANSI Background color codes:<br>## 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white 49=default<br><br>COLOR_RED=$( echo -e "\e[31;49m" ) <br>COLOR_GREEN=$( echo -e "\e[32;49m" )<br>COLOR_YELLO=$( echo -e "\e[33;49m" )<br>COLOR_BLUE=$( echo -e "\e[34;49m" )<br>COLOR_MAGENTA=$(echo -e "\e[35;49m" )<br>COLOR_CYAN=$( echo -e "\e[36;49m" )<br>COLOR_RESET=$( echo -e "\e[0m" )<br><br>## *msg argv: "$str"<br>msg() { gmsg "$@"; }<br>rmsg() { echo "${COLOR_RED}$*${COLOR_RESET}"; }<br>gmsg() { echo "${COLOR_GREEN}$*${COLOR_RESET}"; }<br>ymsg() { echo "${COLOR_YELLO}$*${COLOR_RESET}"; }<br>bmsg() { echo "${COLOR_BLUE}$*${COLOR_RESET}"; }<br>mmsg() { echo "${COLOR_MAGENTA}$*${COLOR_RESET}"; }<br>cmsg() { echo "${COLOR_CYAN}$*${COLOR_RESET}"; }<br><br># colourful print without "\n"<br>msg_() { msg "$@" | tr -d '\n'; }<br>rmsg_() { rmsg "$@" | tr -d '\n'; }<br>gmsg_() { gmsg "$@" | tr -d '\n'; }<br>ymsg_() { ymsg "$@" | tr -d '\n'; }<br>bmsg_() { bmsg "$@" | tr -d '\n'; }<br>mmsg_() { mmsg "$@" | tr -d '\n'; }<br>cmsg_() { cmsg "$@" | tr -d '\n'; }<br><br>## normal message print and log<br>logmsg()<br>{<br> local t=$( date '+%F %T' )<br><br> gmsg "[$t $LLLOCALIP]: $*"<br><br> ## no color in logs<br> mkdir -p "$LLLOGDIR" || { rmsg "can not create $LLLOGDIR"; exit 1; }<br> echo "[$t $ip]: $*" >> "$LLLOG"<br>}<br><br>## normal message print and log, without "\n"<br>logmsg_()<br>{<br> local t=$( date '+%F %T' )<br><br> gmsg_ "[$t $LLLOCALIP]: $*"<br><br> ## no color in logs<br> mkdir -p "$LLLOGDIR" || { rmsg "can not create $LLLOGDIR"; exit 1; }<br> echo -n "[$t $ip]: $*" >> "$LLLOG"<br>}<br><br>## warning<br>warn()<br>{<br> local t=$( date '+%F %T' )<br><br> ## write to STDERR<br> mmsg "[$t $LLLOCALIP]WARNING: $*" >&2<br><br> mkdir -p "$LLLOGDIR" || { rmsg "can not create $LLLOGDIR"; exit 1; }<br> echo "[$t $ip]WARNING: $*" >> "$LLLOG"<br>}<br><br>## fatal, will exit with code 1<br>die()<br>{<br> local t=$( date '+%F %T' )<br><br> ## write to STDERR<br> rmsg "[$t $LLLOCALIP]FATAL: $*" >&2<br><br> mkdir -p "$WORKDIR/log.d" || { rmsg "can not create $WORKDIR/log.d"; exit 1; }<br> echo "[$t $ip]FATAL: $*" >> "$LLLOG"<br><br> exit 1<br>}<br><br>## ---------------------------------------------------------<br><br><br><br><br><br><br>## ---------------------- IP / NIC ------------------------<br><br>## get all interfaces ip addr, but default lo<br>get_ipaddr()<br>{<br> local ipall=$(<br> /sbin/ifconfig | <br> awk '/inet addr:/ { if ($2 !~ /127.0.0.1/) { print substr($2,6)} } '<br> )<br><br> ipall=$( echo $ipall ) ## trim spaces, blank charachers<br> <br> if [[ -n $ipall ]]; then<br> echo $ipall<br> else<br> return 1<br> fi<br>}<br><br>## get all lan ipaddr. not strict<br>get_localip_all()<br>{<br> local ip ipall<br><br> for ip in $( get_ipaddr ); do<br> case $ip in<br> 172.*|192.*|10.*)<br> ## should deal with the newline symbol '\n' by yourself<br> ipall="$ipall $ip"<br> ;;<br> esac<br> done<br><br> ipall=$( echo $ipall ) ## trim spaces, blank charachers<br><br> if [[ -n $ipall ]]; then<br> echo $ipall<br> else<br> return 1<br> fi<br>}<br><br>## get login ip from ssh env val, useful if we have mutilple NICs<br>## this func is not very reliable, use get_localip instead<br>get_loginip()<br>{<br> local ip<br><br> for ip in $( echo $SSH2_CLIENT | awk '{ print $3 }' ) \<br> $( echo $SSH_CONNECTION | awk '{ print $3 }' ) \<br> $( echo $SSH_CLIENT | awk '{ print $1 }' ) ; do<br> if [[ -n $ip ]]; then ## never failed ?<br> echo $ip<br> return 0<br> fi<br> done<br><br> return 1<br>}<br><br>## get a lan ipaddr, must be an private IP, the ip we login is prefered<br>get_localip()<br>{<br> ## to speed up, this func may be called frequently<br> ## maybe we should use $LLLOCALIP directlly instead of callin get_localip<br> [[ -n "$LLLOCALIP" ]] && { echo $LLLOCALIP; return 0; }<br><br> local default_ip=127.0.0.1 ## make sure we return an "IP"<br> local ipall=$( get_localip_all )<br> local ip<br><br> for ip in $( get_loginip ) $ipall; do<br> case $ip in ## check if a private IP, need more strict checking ?<br> 172.*|192.*|10.*)<br> # make sure we find the ip on local host<br> # result from get_login may not correct<br> # note that we do not get '127.0.0.1' from get_localip_all<br> if echo $ipall | grep -wq $ip; then<br> LLLOCALIP=$ip <br> break<br> fi<br> ;;<br> esac<br> done<br><br> if [[ -n "$LLLOCALIP" ]]; then<br> echo $LLLOCALIP<br> return 0<br> else<br> echo $default_ip<br> return 1<br> fi<br>}<br><br>## return the the ip on the given interface<br>## argv: $interface<br>## example: get_ip_for_interface "eth0"<br>get_ip_for_interface()<br>{<br> local iface=$1<br><br> ## /sbin/ifconfig "$iface" 2>/dev/null |<br> /sbin/ifconfig "$iface" |<br> awk '/inet addr:/ { print substr($2,6) } '<br><br> # return the status of ifconfig<br> return ${PIPESTATUS[0]}<br>}<br><br>## include sub interface's ip<br>get_all_ip_for_interface()<br>{<br> local iface=$1<br> local ipall=$( <br> { <br> ## physical interface<br> /sbin/ifconfig | grep -A1 -E "^$iface[[:space:]]+"<br> ## sub interface, such as eth0:0<br> /sbin/ifconfig | grep -A1 -E "^$iface:[0-9]+[[:space:]]+"<br> } |<br> awk '/inet addr:/ { print substr($2,6) } '<br> )<br><br> ipall=$( echo $ipall ) ## trim spaces, blank charachers<br><br> if [[ -n $ipall ]]; then<br> echo $ipall<br> else<br> return 1<br> fi<br>}<br><br><br>## return the netmask for an interface<br>## argv: $interface<br>## example: get_netmask_for_interface "eth0"<br>get_netmask_for_interface()<br>{<br> local iface=$1<br> [[ -n $iface ]] || return 1<br><br> /sbin/ifconfig "$iface" | awk -F: '/Mask:/ { print $NF }'<br><br> ## return the status of ifconfig<br> return ${PIPESTATUS[0]}<br>}<br><br>## 2009-01-12, get mtu for an interface<br>## argv: $interface<br>## example: get_mtu_for_interface "eth0"<br>get_mtu_for_interface()<br>{<br> local iface=$1<br> ## mtu on the sub ifc is the same with the physical ifc<br> ## local iface=${1%%:*}<br><br> /sbin/ifconfig "$iface" | <br> awk '/MTU:/ {<br> if ( $3 ~ /RUNNING/ ) {<br> print substr($5,5)<br> }<br> else {<br> print substr($4,5)<br> } }'<br><br> ## return the status of ifconfig<br> return ${PIPESTATUS[0]}<br>}<br><br>## return the interface name having the "$ip"<br>## maybe a sub interface or a real physical interface<br>get_interface_by_ip()<br>{<br> local ip=$1<br> local ifc<br><br> ifc=$(<br> ## use -a to prevent that the iface is down by ip not cleared<br> /sbin/ifconfig -a | grep -B1 -w "$ip" |<br> awk ' NR == 1 { print $1 } ' <br> )<br><br> if [[ -n $ifc ]]; then<br> echo $ifc<br> else<br> return 1<br> fi<br>}<br><br>## return a real physical interface even if the ip is on a sub interface<br>get_real_interface_by_ip()<br>{<br> local ip=$1<br> local r_ifc<br><br> r_ifc=$( get_interface_by_ip "$ip" | sed 's/:[0-9]\+//' )<br><br> if [[ -n $r_ifc ]]; then<br> echo $r_ifc<br> else<br> return 1<br> fi<br>}<br><br>## return the interface with local ip<br>get_local_iface()<br>{<br> local ip<br> local ifcall=$( <br> for ip in $( get_localip_all ); do<br> get_interface_by_ip "$ip"<br> done<br> )<br><br> if [[ -n $ifcall ]]; then<br> echo $ifcall<br> else<br> return 1<br> fi<br>}<br><br>## return the interface with wan ip, actually, with not lan ip<br>get_wan_iface()<br>{<br> local wanall<br> ## one interface per line<br> get_local_iface | xargs -n1 > /tmp/local.iface<br> /sbin/ifconfig | grep -B1 'addr:[0-9]' |<br> awk '/^(eth|wlan|ppp)/ { print $1 }' > /tmp/all.iface<br><br> wanall=$( grep -xvf /tmp/local.iface /tmp/all.iface )<br> ## /bin/rm "/tmp/local.iface" "/tmp/all.iface"<br><br> if [[ -n $wanall ]]; then<br> echo $wanall<br> else<br> return 1<br> fi<br>}<br><br>## return physical iface with local ip<br>get_real_local_iface()<br>{<br> get_local_iface | xargs -n1 | sed 's/:.*//' | sort -u<br>}<br><br>## return physical iface with wan ip<br>get_real_wan_iface()<br>{<br> get_wan_iface | xargs -n1 | sed 's/:.*//' | sort -u<br>}<br><br>## return the interface without a ip configured on it<br>get_free_iface()<br>{<br> local ifcall=$(<br> /sbin/ifconfig -a |<br> grep -w 'BROADCAST' -B1 |<br> awk '/^[a-z\.]+/ { print $1 }'<br> )<br><br> if [[ -n $ifcall ]]; then<br> echo $ifcall<br> else<br> return 1<br> fi<br>}<br><br>## if we have eth0, this fun may return eth0:0<br>## if we have eth:0, may return eth0:1 ....<br>get_a_free_subname_on()<br>{<br> local iface=$1<br> local i=0<br> local ip=<br> <br> while (( i < 100 )); do<br> ip=$( get_ip_for_interface "${iface}:$i" )<br> if [[ -z $ip ]]; then ## no ip, so it's free<br> echo "${iface}:$i"<br> return 0 ## return directly, not use break<br> fi<br> <br> (( i++ ))<br> done<br> <br> return 1<br>}<br><br>## check if we have at least a sub interface, may used on lvs box<br>## return true / false<br>has_sub_iface()<br>{<br> /sbin/ifconfig | grep -m1 -Eq '^eth[0-9]+:[0-9]+'<br>}<br><br>## call this fun two times, the increment is the flux<br>## argv: $interface<br>get_current_transmit_flux_for()<br>{<br> local dev=$1<br> local NETDEV="/proc/net/dev"<br><br> grep -w "$dev" "$NETDEV" | awk -F: '{ print $2; }' | awk '{ print $9; }'<br><br> return ${PIPESTATUS[0]}<br>}<br><br>## try to find default gw, return the most used ip if default gw not found<br>## this func check gw ip loosely, check following code<br>get_gateway_ip()<br>{<br> /bin/netstat -nr | perl -lnwe '<br> ( $dest, $gw ) = (split)[0,1];<br> if ( $dest eq "0.0.0.0" ) {<br> $default_gw = $gw;<br> }<br> else { <br> $rec{ $gw }++; <br> }<br><br> END {<br> if ( defined $default_gw ) {<br> print $default_gw;<br> exit 0;<br> }<br> <br> $max = 0;<br> for $g ( keys %rec ) {<br> if ( $rec{ $g } > $max ) {<br> $max = $rec{ $g };<br> $default_gw = $g;<br> }<br> }<br> print "$default_gw";<br> }'<br>}<br><br>## this func check DEFAULT gw ip, may return more than one ip !<br>get_default_gateway_ip_on_interface()<br>{<br> local iface=$1<br><br> /bin/netstat -nr |<br> awk -vifc="$iface" '{ if ($1 == "0.0.0.0" && $NF == ifc) { print $2 } }' <br>}<br><br>## may return more than 1 ip, check it by yourself !<br>## this func check gwip loosely, check following code<br>get_gateway_ip_on_interface()<br>{ <br> local ifc=$1<br><br> if [[ -z $ifc ]]; then<br> return 1<br> fi<br><br> netstat -nr | perl -lne '<br> BEGIN{ $ifc = pop @ARGV; }<br><br> next unless /^\d/;<br><br> if (/^0\.0\.0\.0\s+(\d+\.\d+\.\d+\.\d+).*$ifc\s*$/) {<br> $found=1;<br> print $1;<br> exit 0;<br> }<br> elsif (/^\d+\.\d+\.\d+\.\d+\s+(\d+\.\d+\.\d+\.\d+).*$ifc\s*$/) {<br> next if $1 eq "0.0.0.0";<br> $gw{$1}++;<br><br> ## print "found [$_]"<br> }<br><br> END {<br> unless ( $found ) {<br> for ( sort keys %gw ) {<br> ## print "$_\t$gw{$_}";<br> print $_;<br> }<br> }<br> }<br><br> ' "$ifc"<br>}<br><br>## check if a host online<br>## return true / false<br>is_host_online()<br>{<br> local host=$1<br> local try=2<br><br> [[ -n $host ]] || return 1<br><br> ## some old versions of nmap seems more slowly when dest unreachable<br> while (( try >= 0 )); do<br> if ping -c2 -w2 "$host" 2>/dev/null | grep -q ' [12] received'; then<br> return 0<br> fi<br><br> (( try-- ))<br> done<br><br> return 1<br>}<br><br>## return true / false<br>is_a_valid_port()<br>{<br> local port=$1<br> local p=$( echo $port | tr -d '0-9' )<br><br> ## having non-digit character<br> if [[ -n "$p" ]]; then<br> return 1<br> fi<br> <br> if (( port >= 1 )) && (( port <= 65535 )); then<br> return 0<br> else<br> return 1<br> fi<br>}<br><br>## return true / false<br>is_an_valid_ip()<br>{<br> local ip=$1<br><br> ## simple checking<br> if [[ "$ip" == "0.0.0.0" ]] || [[ "$ip" == "255.255.255.255" ]]; then<br> return 1<br> fi<br><br> ## not perfect checking ...<br> echo "$ip" | grep -qE '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$'<br>}<br><br>ifdown_an_ip()<br>{<br> local ip=$1<br> <br> [[ -n $ip ]] || return 1<br><br> local iface=$( get_interface_by_ip "$ip" )<br> if [[ -z $iface ]]; then<br> return 1 ## no-op<br> fi<br><br> ifdown_an_iface "$iface"<br>}<br><br>## dangerous to down a phycal interface, use "force" as argv[2] if you know what you are doing<br>ifdown_an_iface()<br>{<br> local iface=$1<br> local downall=$2<br><br> local ip_cnt<br><br> [[ -n $iface ]] || return 1<br><br> case $iface in<br> *:[0-9]*) ## sub interface, just clear the ip configured<br> /sbin/ifconfig "$iface" 0 &> /dev/null || :<br> ;;<br> *) ## physical interface, if there is only one ip, down the nic<br> ## else just clear the ip configured<br> ip_cnt=$( get_all_ip_for_interface "$iface" | xargs -n1 | wc -l )<br> if (( ip_cnt > 1 )); then<br> if [[ $downall == "force" ]]; then<br> /sbin/ifconfig "$iface" 0 down &> /dev/null || :<br> else<br> /sbin/ifconfig "$iface" 0 &> /dev/null || :<br> fi<br> ## no mare than 1 ip on it, safe<br> else<br> /sbin/ifconfig "$iface" 0 down &> /dev/null || :<br> fi<br> ;;<br> esac<br><br> if [[ -z $( get_ip_for_interface "$iface" ) ]]; then<br> return 0<br> else<br> return 1<br> fi<br>}<br><br>use_ip_2ping()<br>{<br> local src_ip=$1<br> local dest_ip=$2<br><br> local cnt=3<br><br> while (( cnt >= 0 )); do<br> ping -c1 -w1 -I "$src_ip" "$dest_ip" 2>/dev/null | <br> grep -q '[[:blank:]]0% packet loss'<br><br> (( $? == 0 )) && return 0<br> (( cnt-- ))<br> done<br><br> return 1<br>}<br><br>## ---------------------------------------------------------<br><br><br><br><br><br>## ------------------- dir /path / --------------------------<br><br>## get the working dir name, may return the dirname of the script we are running<br>## actually, we may have to find the workdir first to source this file -_-!<br>## anyway, var LLLOG needs this<br>get_workdir()<br>{<br> local d<br><br> ## may be I should check $0 ~ *.sh simplly<br> case $- in<br> *i*) ## sourced in an interactive-bash ?<br> d=$( pwd )<br> ;;<br> *)<br> d=$( cd `dirname "$0"` && pwd )<br> ;;<br> esac<br><br> echo "$d"<br>}<br><br>## rename a file or dir to make sure the filename or dirname would be OK to reuse<br>## if "abc" exits, it will be renamed as "abc.old"<br>## argv: $pathname<br>## example: remove_old "/usr/local/apache" && ./configure --prefix=/usr/local/apache<br>remove_old()<br>{<br> local name="$1"<br> local oldname="${name}.old"<br><br> if ! [[ -e "$name" || -L "$name" ]]; then<br> return<br> fi<br> <br> ## never rename '/', $1 must be an error argv<br> [[ "$name" == "/" ]] && die "you really rename / ?"<br><br> [[ -e "$oldname" ]] && rm -rf "$oldname"<br> [[ -L "$oldname" ]] && rm -rf "$oldname"<br><br> /bin/mv "$name" "$oldname"<br>}<br><br>## a simple mktemp. some old os have no /bin/mktemp, to create uniq temp file/dir<br>## the command on slk and suse behaves differently, so re-write it<br>## argv1: -d / -f<br>## argv2: $path<br>## example: mktemp -f /tmp/<br>mktemp()<br>{<br> local opt=$1 ## file or dir<br> local dir=$2 ## base path<br> local tmp<br><br> ## make sure we find a uniq file / dir name<br> while :; do<br> if [[ -n "$dir" ]]; then<br> tmp="$dir/$( date +%s ).$$.$RANDOM"<br> elif [[ -n "$WORKDIR" ]]; then<br> tmp="$WORKDIR/$( date +%s ).$$.$RANDOM"<br> else<br> tmp="./$$.$RANDOM.$( date +%s )"<br> fi<br><br> [[ -e $tmp ]] || break<br> done<br><br> if [[ $opt == "-d" ]]; then<br> mkdir -p "$tmp" || return 1<br> else<br> mkdir -p "$( dirname $tmp )" || return 1<br> touch "$tmp" || return 1<br> fi<br><br> echo $tmp<br>}<br><br>## essential files/dirs must be there<br>## argv: $pathname<br>## example: must_exist "$WORKDIR/mysql.tar.bz"<br>must_exist()<br>{<br> local t<br> local flag=0<br><br> for t; do<br> if [[ -e "$t" ]]; then<br> logmsg "[$t] FOUND, OK"<br> else<br> flag=1<br> warn "[$t] NOT FOUND, NOTOK"<br> fi<br> done<br><br> (( flag != 0 )) && die "FILES NOT FOUND, ABORTING ..."<br>}<br><br>## try to find the mountpoint for a pathname<br>get_mountpoint_for_pathname()<br>{<br> local path=$1<br> <br> [[ -n $path ]] || return 1<br> [[ -e $path ]] || return 1<br><br> df "$path" 2>/dev/null | awk 'NR == 2 { print $NF }'<br>}<br><br>## try to find the mountpoint for a pathname<br>get_devname_for_mountpoint()<br>{<br> local path=$1<br><br> [[ -n $path ]] || return 1<br> [[ -d $path ]] || return 1<br><br> df "$path" 2>/dev/null | awk 'NR == 2 { print $1 }'<br>}<br><br>## ---------------------------------------------------------<br><br><br><br><br><br><br>## --------------------- OS / HW info ----------------------<br><br>## check if running on SUSE OS<br>## return true / false<br>check_suseos()<br>{<br> if [[ -f "/etc/SuSE-release" ]]; then<br> grep -wqF 'SUSE' /etc/SuSE-release && return 0<br> fi<br><br> [[ -x /sbin/yast2 ]] && return 0 || :<br> <br> return 1<br>}<br><br>## check if running on Slackware OS<br>## return true / false<br>check_slkos()<br>{<br> if [[ -f "/etc/slackware-version" ]]; then<br> grep -wqF 'Slackware' /etc/slackware-version &>/dev/null && return 0<br> fi<br><br> [[ -x /sbin/installpkg ]] && return 0 || :<br><br> return 1<br>}<br><br>## check if running on RedHat OS<br>## return true / false<br>check_rhos()<br>{<br> if [[ -f /etc/redhat-release ]]; then<br> grep -wqi red /etc/redhat-release &>/dev/null && return 0<br> fi<br><br> return 1<br>}<br><br>## print OS info, now just os version <br>get_osinfo()<br>{<br> ## use xargs to delete '\n', I love xargs!<br> if check_suseos; then<br> xargs < /etc/SuSE-release<br> elif check_slkos; then<br> xargs < /etc/slackware-version<br> elif check_rhos; then<br> xargs < /etc/redhat-release<br> else<br> ## lsb_release may be found on ubuntu, debian, etc.<br> lsb_release -d 2>/dev/null || echo 'UNKNOWD OS'<br> fi<br>}<br><br>## print OS name<br>get_osname()<br>{<br> if check_suseos; then<br> echo SUSE<br> elif check_slkos; then<br> echo SLK<br> elif check_rhos; then<br> echo RH<br> else<br> echo UNKNOWN<br> return 1<br> fi<br>}<br><br>## with bit flag<br>get_osname2()<br>{<br> echo $( get_osver )_$( get_cputype )<br>}<br><br>## return 32/64, based on OS but not hardware<br>get_cputype()<br>{<br> if uname -a | grep -Fq 'x86_64'; then<br> echo 64<br> else<br> echo 32<br> fi<br>}<br><br>get_osver()<br>{<br> if grep -Eq 'Slackware[[:blank:]]+8\.[0-9]' /etc/slackware-version; then<br> echo slk8<br> elif grep -Eq 'Slackware[[:blank:]]+10\.[0-9]' /etc/slackware-version; then<br> echo slk10<br> elif check_suseos; then<br> echo "suse$( get_cputype )"<br> elif check_rhos; then<br> echo "rh$( get_cputype )"<br> else<br> echo "UNKNOWN"<br> fi 2>/dev/null<br>}<br><br>## return kernel version: 2.4 / 2.6<br>get_kernver()<br>{<br> /sbin/kernelversion 2>/dev/null ||<br> uname -r | grep -o '^2\..'<br>}<br><br>## get free capacity of a partition by a filename/pathname<br>get_free_cap()<br>{<br> local path=$1<br><br> if [[ ! -e "$path" ]]; then<br> echo 0B<br> return<br> fi<br><br> ## df so cool!<br> df -h "$path" | awk 'NR==2 { print $4 }'<br>}<br><br><br>## get the size of files by du<br>## example: get_file_size "/var/log"<br>get_file_size()<br>{<br> ## do not quote [$file], may contain more than one filename<br> local file=$1<br> local size=$( du -sh $file 2>/dev/null | awk '{ print $1; exit }' || echo 0B )<br><br> echo ${size: -1} | grep -q '^[0-9]$' && size=${size}B<br> echo ${size:-0B}<br>}<br><br>## get the size of physical mem<br>get_mem_size()<br>{<br> local unit=$1<br> local resut dividend<br><br> case $unit in <br> k|K)<br> dividend=1<br> ;;<br> m|M)<br> dividend=1000<br> ;;<br> g|G)<br> dividend=1000000<br> ;;<br> t|T)<br> dividend=1000000000<br> ;;<br> *)<br> dividend=1 ## default, K<br> ;;<br> esac<br><br> resut=$( awk '/^MemTotal/ { print $2 }' /proc/meminfo )<br> calculate2 "$resut / $dividend"<br>}<br><br>## get the size of all hard disks<br>get_hdd_size()<br>{<br> local unit=$1<br> local resut dividend<br><br> case $unit in <br> k|K)<br> dividend=1<br> ;;<br> m|M)<br> dividend=1000<br> ;;<br> g|G)<br> dividend=1000000<br> ;;<br> t|T)<br> dividend=1000000000<br> ;;<br> *)<br> dividend=1 ## default, K<br> ;;<br> esac<br><br> ## check /proc/partitions, fdisk -l not reliable<br> resut=$( <br> awk 'BEGIN{ total = 0 }<br> {<br> if ( $1 !~ /^[[:space:]]*[0-9]+/ ) {<br> next<br> }<br> <br> if ( $NF ~ /cciss\/c[0-9]d[0-9][[:space:]]*$/ || $NF ~ /[sh]d[a-z][[:space:]]*$/ ) {<br> total += $3<br> }<br> }<br> END { printf("%d", total) }' /proc/partitions<br> )<br><br> calculate2 "$resut / $dividend"<br>}<br><br>## get cpu name: intel/amd x $core_num<br>get_cpu_name()<br>{<br> awk 'BEGIN{ num = 0; name = "unknow"; FS = ":" }<br> {<br> if ( $1 !~ /^model name/ ) {<br> next<br> }<br> if ( $0 ~ /[Ii]ntel/ ) {<br> name = "Intel"<br> }<br> else if ( $0 ~ /AMD/ ) {<br> name = "Amd"<br> }<br> else {<br> name = 'unknow'<br> }<br> num++<br> }<br> END { print name"x"num }' /proc/cpuinfo<br>}<br><br>## get cpu cache sizes<br>get_cpu_cachesize()<br>{<br> awk 'BEGIN{ num = 0; size = 0; FS = ":"; }<br> {<br> if ( $1 ~ /^cache size/ ) {<br> num++<br> size = $2 + 0<br> }<br> }<br> END { print size"Kx"num }' /proc/cpuinfo<br>}<br><br>## 2009-01-14 samli, check if a partition readonly<br>## argv: $mountpoint / $pathname<br>## return true / false<br>is_partition_readonly()<br>{<br> local p=$1<br> local mountpoint<br> local rw_flag<br> <br> mountpoint=$( get_mountpoint_for_pathname "$p" )<br><br> ## rw_flag: ro / rw<br> rw_flag=$(<br> awk -vp=$mountpoint '<br> {<br> if ( $1 != "/dev/root" && $2 == p ) {<br> str=$4<br> gsub(",.*", "", str)<br> print str<br> exit<br> }<br> }' /proc/mounts )<br> <br> if [[ $rw_flag == "ro" ]]; then<br> return 0<br> else<br> return 1<br> fi<br>}<br><br>## 2009-01-14 samli, check if a partition no space left<br>## argv: $mountpoint / $pathname<br>## return true / false<br>is_partition_full()<br>{<br> local p=$1<br> local full_flag<br><br> case $p in<br> /*)<br> ;;<br> *)<br> return 1<br> ;;<br> esac<br> <br> ## check inode and data area<br> full_flag=$( <br> { df -Pi "$p"; df -Pk "$p"; } |<br> awk '! /^Filesystem/ {<br> usage = $(NF-1) + 0<br> if ( usage == 100 ) {<br> print "Y"<br> exit<br> }<br> }'<br> )<br><br> if [[ $full_flag == "Y" ]]; then<br> return 0<br> else<br> return 1<br> fi<br>} <br><br>## find the username we added manually<br>## see man shadow to find the detail of the policy<br>find_non_sys_user()<br>{<br><br> # need root privilege to access '/etc/shadow'<br> (( UID == 0 )) || return 1<br><br> perl -we '<br> use strict;<br> my @users;<br> my $fd;<br> my ( $user, $pass, $uid );<br> <br> ## find the username having password<br> open ($fd, "<", "/etc/shadow") or die "Can not open /etc/shadow\n";<br> while (<$fd>) {<br> ($user, $pass ) = (split ":")[0,1];<br> next if $user eq "root";<br> <br> if ( $pass =~ m{ [a-zA-Z0-9/\$] }x ) {<br> push @users, $user;<br> } <br> elsif ( $pass eq "" ) {<br> push @users, $user;<br> }<br> }<br> close $fd or die "Can not close $fd\n";<br><br> ## find the username having uid >= normal uid<br> open ($fd, "<", "/etc/passwd") or die "Can not open /etc/passwd\n";<br> while (<$fd>) {<br> ($user, $uid ) = (split ":")[0,2];<br> next if $user eq "root";<br> next if $user eq "nobody";<br> <br> if ( $uid >= 1000 ) { ## should read this val from /etc/login.defs<br> push @users, $user unless grep { /\b$user\b/ } @users;<br> }<br> elsif ( $uid == 0 ) { ## make sure dangerous user with uid = 0<br> push @users, $user unless grep { /\b$user\b/ } @users;<br> }<br> }<br> close $fd or die "Can not close $fd\n";<br><br> for my $u (sort @users) {<br> print "$u", " ";<br> }<br> '<br>}<br><br>## ---------------------------------------------------------<br><br><br><br><br><br><br>## ------------------------ KERNELL ------------------------<br>## check if kernel supports iptables<br>## return true / false<br>kernel_support_iptables()<br>{<br> iptables -L -n &> /dev/null<br>}<br><br>## check if kernel supports ip conntrack<br>## return true / false<br>kernel_support_state()<br>{<br> ## [[ -f /proc/sys/net/ipv4/ip_conntrack_max ]]<br> [[ -f /proc/net/ip_conntrack ]]<br>}<br><br>## check if kernel supports lvs-rs by checking tunl interface <br>## return true / false<br>kernel_support_rs()<br>{<br> /sbin/ifconfig tunl0 &> /dev/null<br>}<br><br>## check if kernel supports lvs-ld<br>## return true / false<br>kernel_support_ld()<br>{<br> kernel_support_rs || return 1<br> [[ -f /proc/net/ip_vs ]] || return 1<br><br> return 0<br>}<br><br>## 2009-03-25, get the label name of stateful kernel from lilo.conf<br>#+ but do not change 2.4->2.6 or 2.6->2.4 unthinkingly, nic name may change after reboot<br>## argv: 2.4 / 2.6<br>get_state_label_for_slk()<br>{<br> ver=$1<br><br> case $ver in<br> 2.4) ##<br> grep -m1 -E 'vmlinuz-2\.4.*STATE' /etc/lilo.conf -A4 |<br> awk -F= '/label/{ print $2 }' |<br> trim<br> ;;<br> 2.6)<br> grep -m1 -E 'vmlinuz-2\.6.*STATE' /etc/lilo.conf -A4 |<br> awk -F= '/label/{ print $2 }' |<br> trim<br> ;;<br> *)<br> return 1<br> ;;<br> esac<br>}<br><br>## ---------------------------------------------------------<br><br><br><br><br><br><br>## ------------------------ tarball ------------------------<br><br>## get tarball dirname, /1/2/3/abc.tar.bz -> abc<br>## argv: $path_to_tarballname<br>## return dirname<br>get_tarball_dirname()<br>{<br> local tb="$1"<br> case $tb in<br> *.tar.bz2|*.tar.gz)<br> echo $tb | sed -e 's@.*/@@g' -e 's@\.tar\.\(bz2\|gz\)$@@'<br> ;;<br> *.tgz|*.tbz)<br> echo $tb | sed -e 's@.*/@@g' -e 's@\.\(tbz\|tgz\)$@@'<br> ;;<br> *.tar)<br> echo $tb | sed -e 's@.*/@@g' -e 's@\.tar$@@'<br> ;;<br> *)<br> echo $tb<br> return 1<br> ;;<br> esac<br>}<br><br>## argv: $path_to_tarballname<br>## return bzip2 / gzip / tar<br>get_tarball_type()<br>{<br> if file "$1" | grep -Fq 'bzip2 compressed data'; then<br> echo bzip2 <br> elif file "$1" | grep -Fq 'gzip compressed data'; then<br> echo gzip<br> elif file "$1" | grep -Fq "POSIX tar archive"; then<br> echo tar<br> else<br> return 1<br> fi<br>}<br><br>## ---------------------------------------------------------<br><br><br><br><br><br><br>## --------------------------- NUM -------------------------<br><br>## a simple int calculater<br>## argv: "$math_expression"<br>## example: calculate "10 / 2"<br>calculate()<br>{<br> local expr=$@<br><br> if which bc &>/dev/null; then<br> echo "scale = 0; $expr" | bc<br> elif which perl &>/dev/null; then<br> echo "$expr" | perl -lne ' print int (eval) '<br> else<br> echo $(( $expr ))<br> fi<br>}<br><br>## support float<br>calculate2()<br>{<br> local expr=$@<br><br> if which bc &>/dev/null; then<br> echo "scale = 2; $expr" | bc<br> elif which perl &>/dev/null; then<br> echo "$expr" | perl -lne ' printf ("%0.2f", (eval) ) '<br> else ## may try awk here<br> return 1<br> fi<br>}<br>## check if argv1 >= argv2<br>## argv1: $num_1<br>## argv2: $num_2<br>compare_two_num()<br>{<br> if (( $# != 2 )); then<br> return 1<br> fi<br><br> ## hope perl is install in every OS ...<br> perl -we ' my ($v1, $v2) = @ARGV; exit ( $v1 >= $v2 ? 0 : 1 ) ' $1 $2<br>}<br><br>## get a random num<br>## argv: $max, optionall<br>get_a_random_num()<br>{<br> local max=$1<br> local rand=0<br><br> if [[ -z $max ]]; then<br> echo $(( RANDOM + 1 )) ## 1 ~ 32768, see man bash<br> else<br> # echo $RANDOM$RANDOM % $1 | perl -lne ' print eval '<br> while (( rand == 0 )); do<br> ## 3276732767 < ( 2^32 = 4294967296 )<br> rand=$( calculate "( $RANDOM$RANDOM + $RANDOM + $RANDOM ) % $max" )<br> done<br> echo $rand<br> fi<br>}<br><br>## get ntp time offset<br>## sorry to hear that ntpdate is deprecated in opensuse 11.1<br>get_ntp_offset()<br>{<br> local NTP_SERVER="pool.ntp.org"<br> local offset<br><br> ## to speed up, just query one server every time<br> ## so , the ntp server must be reliable<br> for srv in $NTP_SERVER; do<br> offset=$( <br> /usr/sbin/ntpdate -q $NTP_SERVER 2> /dev/null |<br> awk '/time server.*sec$/ { print $( NF -1 ) }' |<br> sed 's/-//' ## get abs val<br> )<br><br> if [[ -n $offset ]]; then<br> echo $offset<br> return 0<br> fi<br> done<br><br> return 1<br>}<br><br>## ---------------------------------------------------------<br><br><br><br><br><br><br>## ------------------------- MISC --------------------------<br><br>dump_cron()<br>{<br> local user=$1<br><br> local user_flag<br><br> if [[ -n $user ]]; then<br> if (( UID != 0 )); then<br> return 1<br> fi<br><br> user_flag="-u $user"<br> fi<br><br> crontab $user_flag -l | <br> perl -lne ' print if ( ( $. > 3 ) || ( $. <= 3 && /^[^#] /) ) ' <br>}<br><br>## add a cron jobs line to crontab, with 'force' arg to add a comment line<br>## example: add_cron "### sync clock every hour" "force"<br>## example: add_cron "30 * * * * /usr/sbin/ntpdate 172.23.32.142 &> /dev/null"<br>## example: add_cron "30 * * * * /usr/sbin/ntpdate 172.23.32.142 &> /dev/null" "mqq"<br>add_cron()<br>{<br> local cmd=$1<br> local force=$2<br> local user=$3<br> local key<br> local is_comment<br><br> local user_flag<br><br> if [[ -n $user ]]; then<br> if (( UID != 0 )); then<br> return 1<br> fi<br><br> user_flag="-u $user"<br> fi<br><br> # good to use absolute path in crontab<br> local c<br> for c in $cmd; do<br> case $c in<br> /*)<br> ## key=$( basename $c )<br> key=$c<br> break<br> ;;<br> esac<br> done<br><br> if ! [[ $force == "force" || $force == "FORCE" ]]; then<br> if [[ -z "$key" ]]; then<br> warn "failed, [$cmd] not use abs_path to command"<br> return 1<br> fi<br><br> if [[ ! -x "$c" ]]; then<br> warn "failed, [$c] not executable"<br> return 1<br> fi<br><br> if crontab $user_flag -l | grep -F -v '#' | grep -Fqw -- "$key"; then<br> warn "failed, keyword [$key] found in crontab already"<br> return 1<br> fi<br> fi<br><br> if echo "$cmd" | grep -Eq '^[[:blank:]]+#'; then<br> is_comment=yes<br> fi<br><br> # update crontab<br> # crontab $user_flag -l | perl -lne ' print if ( ( $. > 3 ) || ( $. <= 3 && /^[^#] /) ) ' |<br> dump_cron "$user" |<br> { <br> cat <br> [[ $is_comment == "yes" ]] || echo "## DO NOT DELETE! [ $key ] added by AMC at $(date '+%F %T')"<br> echo "$cmd"<br> } | crontab - $user_flag<br>} <br><br>comment_cron()<br>{<br> local key=$1<br> local user=$2<br><br> local user_flag<br><br> [[ -n $key ]] || return 1<br><br> if [[ -n $user ]]; then<br> if (( UID != 0 )); then<br> return 1<br> fi<br><br> user_flag="-u $user"<br> fi<br><br> # crontab $user_flag -l | perl -lne ' print if ( ( $. > 3 ) || ( $. <= 3 && /^[^#] /) ) ' |<br> dump_cron "$user" |<br> sed "/$key/ s/^/## /" | crontab - $user_flag<br>}<br><br>del_cron()<br>{<br> local key=$1<br> local user=$2<br><br> local user_flag<br><br> [[ -n $key ]] || return 1<br><br> if [[ -n $user ]]; then<br> if (( UID != 0 )); then<br> return 1<br> fi<br><br> user_flag="-u $user"<br> fi<br><br> ## nonsense 3 lines header<br> # crontab $user_flag -l | perl -lne ' print if ( ( $. > 3 ) || ( $. <= 3 && /^[^#] /) ) ' |<br> dump_cron "$user" |<br> grep -v -- "$key" | crontab - $user_flag<br>}<br><br>## trim leading space and tailing space<br>## example: iptables -nvL | trim<br>## example: trim < file<br>trim()<br>{<br> sed -e 's/^[[:space:]]\+//' -e 's/[[:space:]]\+$//'<br>}<br><br>## check if a string already in a file which is not commented<br>## argv1: $str<br>## argv2: $filename<br>## return true / false<br>is_str_infile()<br>{<br> local str="$1"<br> local file="$2"<br><br> grep -Fv '#' "$file" | grep -Fwq -- "$str"<br>}<br><br>## kill a process if it's running<br>## argv: $app_name<br>try_kill_proc()<br>{<br> local proc="$1"<br><br> if killall -0 "$proc" &>/dev/null; then<br> if killall -9 "$proc"; then<br> logmsg "found old "$proc" running, kill OK"<br> else<br> die "found old "$proc" running, kill FAILED"<br> fi<br> fi<br>}<br><br>## to grep multipul times, supposed to be used after a pipe or with read redirection<br>## example: ps -ef | mgrep samli ssh<br>mgrep()<br>{<br> local key="$1"<br> local opt=<br><br> if [[ -z "$key" ]]; then<br> cat <br> return <br> fi<br><br> while [[ ${key:0:1} == '-' ]]; do<br> opt="$opt $key"<br> shift<br> key="$1"<br> done<br><br> shift <br> grep $opt $key | mgrep "$@"<br>}<br><br><br>## thanks kangkang <br>dectobin()<br>{<br> local s=$1<br> local n <br><br> while (( $s != 0 )); do<br> n=$(( s % 2 ))$n<br> s=$(( s / 2 ))<br> done <br><br> echo $n <br>}<br><br>## thanks kangkang <br>cidr_mask()<br>{<br> local i<br> local mask=$1<br> local out<br><br> for i in $( echo $mask | tr '.' ' ' ); do<br> out=$out$(dectobin $i)<br> done<br> <br> out=$(echo $out | sed 's/0*$//g' )<br><br> if echo $out | grep -q 0; then<br> return 1<br> fi<br><br> echo -n $out | wc -c<br>}<br><br>## xor op, usring P$1" <br>## argv[1]: key to xor with<br>## argv[2]: str to xor<br>myxor()<br>{<br> local key=$1<br> local str=$2<br><br> perl -lwe ' <br> my $key = shift;<br> $_ = shift;<br> my @new;<br> for my $s ( split( "" ) ) {<br> push @new, chr( (ord $s) ^ $key );<br> }<br> print join "", @new;<br> ' "$key" "$str"<br>}<br><br>## get_name_of_pid()<br>## {<br>## local pid=$1<br>## <br>## /bin/ls -l "/proc/$pid/exe" 2>/dev/null<br>## }<br><br>is_dos_file()<br>{<br> local file=$1<br><br> file "$file" | grep -q 'with CRLF line terminators'<br>}<br><br>## dos2unix is lost on some servers -_-!<br>my_dos2unix()<br>{<br> local file=$1<br><br> if which dos2unix ; then<br> dos2unix "$file"<br> else<br> perl -pi -e 's/\r$//' "$file"<br> fi &> /dev/null<br>}<br><br>dos2unix_if_necessary()<br>{<br> local file=$1<br><br> [[ -f $file ]] || return 1<br><br> if is_dos_file "$file"; then<br> my_dos2unix "$file"<br> else<br> return 0<br> fi<br>}<br><br>## find the java dirname without unpacking jdk*.bin<br>## we may return [jdk1.5.0_06] for [jdk-1_5_0_06-linux-i586.bin]<br>get_javadir_from_javabin()<br>{<br> javabin=$1 ## such as [jdk-1_5_0_06-linux-i586.bin]<br><br> if [[ -z $javabin ]] || [[ ! -f $javabin ]]; then<br> return 1<br> fi<br><br> grep -m1 -a '^javahome=jdk.*' "$javabin" |<br> awk -F= '{ print $2 }'<br>}<br><br>## ---------------------------------------------------------<br><br><br><br><br>## ----------------------- PROCESS -------------------------<br><br>## check if a given pid/appname running<br>## argv: pid / appname<br>is_app_running()<br>{<br> local $p=$1<br> local RC<br><br> [[ -n $p ]] || return 1<br> <br> ## pid<br> if [[ -z $( echo $p | tr -d '[0-9]') ]]; then<br> kill -0 "$p" &> /dev/null<br> RC=$?<br> ## app name<br> else<br> killall -0 "$p" &> /dev/null<br> RC=$?<br> fi<br><br> return $RC<br>}<br><br>lock_on()<br>{<br> local f=$1<br> local freefd=6 ## do not use fd 5<br><br> ## make sure the file be there<br> mkdir -p "$( dirname $f )"<br> touch "$f"<br><br> ## find a free fd<br> while (( freefd <= 9 )); do<br> [[ -L /dev/fd/$freefd ]] || break<br> (( freefd++ ))<br> done<br><br> (( freefd == 10 )) && return 1<br><br> ## open the lock file<br> eval "exec $freefd< \"$f\""<br>}<br><br>is_locked()<br>{<br> local f=$1<br><br> fuser "$f" &> /dev/null<br>}<br><br>## -------------------- init global vars -------------------<br><br>## init LLLOCALIP, do not delete following line, logmsg/warn/die use this val<br>LLLOCALIP=$( get_localip )<br><br>## init WORKDIR<br>[[ -n $WORKDIR ]] || WORKDIR=$( get_workdir )<br><br>## init LLLOG, LLLOGDIR <br>## this val must be used after the logdir created in func logmsg/logmsg_/warn/die<br>[[ -n $LLLOG ]] || LLLOG="$WORKDIR/log.d/log.$LLLOCALIP"<br>[[ -n $LLLOGDIR ]] || LLLOGDIR=${LLLOG%/*}<br><br>## ---------------------------------------------------------<br></pre> from:<br><a >http://bbs.linuxeden.com/thread-192227-1-1.html </a><br><a >http://huan.googlecode.com/svn/bash/func-common.sh </a><br><br><img src ="http://www.shnenglu.com/beautykingdom/aggbug/114291.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/beautykingdom/" target="_blank">chatler</a> 2010-05-03 22:42 <a href="http://www.shnenglu.com/beautykingdom/archive/2010/05/03/114291.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>x掉就q行的shell脚本Q最好不要去试哈http://www.shnenglu.com/beautykingdom/archive/2010/03/26/110595.htmlchatlerchatlerFri, 26 Mar 2010 09:24:00 GMThttp://www.shnenglu.com/beautykingdom/archive/2010/03/26/110595.htmlhttp://www.shnenglu.com/beautykingdom/comments/110595.htmlhttp://www.shnenglu.com/beautykingdom/archive/2010/03/26/110595.html#Feedback0http://www.shnenglu.com/beautykingdom/comments/commentRss/110595.htmlhttp://www.shnenglu.com/beautykingdom/services/trackbacks/110595.html# <--- 這個別亂跑Q好奇會Mh的!

echo '十h|日一|十十o' | sed 's/.../&\n/g'  
# <--- 跟你就不聽Q再跑這個好?..

chatler 2010-03-26 17:24 发表评论
]]>
shell版俄|斯方块http://www.shnenglu.com/beautykingdom/archive/2010/03/26/110578.htmlchatlerchatlerFri, 26 Mar 2010 03:51:00 GMThttp://www.shnenglu.com/beautykingdom/archive/2010/03/26/110578.htmlhttp://www.shnenglu.com/beautykingdom/comments/110578.htmlhttp://www.shnenglu.com/beautykingdom/archive/2010/03/26/110578.html#Feedback0http://www.shnenglu.com/beautykingdom/comments/commentRss/110578.htmlhttp://www.shnenglu.com/beautykingdom/services/trackbacks/110578.html#!/bin/bash

# Tetris Game
# 10.21.2003 xhchen<[email]xhchen@winbond.com.tw[/email]>

#APP declaration
APP_NAME="${0##*[\\/]}"
APP_VERSION="1.0"


#颜色定义
cRed=1
cGreen=2
cYellow=3
cBlue=4
cFuchsia=5
cCyan=6
cWhite=7
colorTable=($cRed $cGreen $cYellow $cBlue $cFuchsia $cCyan $cWhite)

#位置和大?br>iLeft=3
iTop=2
((iTrayLeft = iLeft + 2))
((iTrayTop = iTop + 1))
((iTrayWidth = 10))
((iTrayHeight = 15))

#颜色讄
cBorder=$cGreen
cScore=$cFuchsia
cScoreValue=$cCyan

#控制信号
#Ҏ戏用两个进E,一个用于接收输入,一个用于游戏流E和昄界面;
#当前者接收到上下左右{按键时Q通过向后者发送signal的方式通知后者?br>sigRotate=25
sigLeft=26
sigRight=27
sigDown=28
sigAllDown=29
sigExit=30

#七中不同的方块的定义
#通过旋{Q每U方块的昄的样式可能有几种
box0=(0 0 0 1 1 0 1 1)
box1=(0 2 1 2 2 2 3 2 1 0 1 1 1 2 1 3)
box2=(0 0 0 1 1 1 1 2 0 1 1 0 1 1 2 0)
box3=(0 1 0 2 1 0 1 1 0 0 1 0 1 1 2 1)
box4=(0 1 0 2 1 1 2 1 1 0 1 1 1 2 2 2 0 1 1 1 2 0 2 1 0 0 1 0 1 1 1 2)
box5=(0 1 1 1 2 1 2 2 1 0 1 1 1 2 2 0 0 0 0 1 1 1 2 1 0 2 1 0 1 1 1 2)
box6=(0 1 1 1 1 2 2 1 1 0 1 1 1 2 2 1 0 1 1 0 1 1 2 1 0 1 1 0 1 1 1 2)
#所有其中方块的定义都放到box变量?br>box=(${box0[@]} ${box1[@]} ${box2[@]} ${box3[@]} ${box4[@]} ${box5[@]} ${box6[@]})
#各种方块旋{后可能的样式数目
countBox=(1 2 2 2 4 4 4)
#各种方块再box数组中的偏移
offsetBox=(0 1 3 5 7 11 15)

#每提高一个速度U需要积累的分数
iScoreEachLevel=50        #be greater than 7

#q行时数?br>sig=0                #接收到的signal
iScore=0        #d
iLevel=0        #速度U?br>boxNew=()        #C落的方块的位|定?br>cBoxNew=0        #C落的方块的颜?br>iBoxNewType=0        #C落的方块的种c?br>iBoxNewRotate=0        #C落的方块的旋转角?br>boxCur=()        #当前方块的位|定?br>cBoxCur=0        #当前方块的颜?br>iBoxCurType=0        #当前方块的种c?br>iBoxCurRotate=0        #当前方块的旋转角?br>boxCurX=-1        #当前方块的x坐标位置
boxCurY=-1        #当前方块的y坐标位置
iMap=()                #背景方块图表

#初始化所有背景方块ؓ-1, 表示没有方块
for ((i = 0; i < iTrayHeight * iTrayWidth; i++)); do iMap[$i]=-1; done


#接收输入的进E的d?br>function RunAsKeyReceiver()
{
        local pidDisplayer key aKey sig cESC sTTY

        pidDisplayer=$1
        aKey=(0 0 0)

        cESC=`echo -ne "\033"`
        cSpace=`echo -ne "\040"`

        #保存l端属性。在read -sdl端键时Q终端的属性会被暂时改变?br>        #如果在read -s时程序被不幸杀掉,可能会导致终端؜乱,
        #需要在E序退出时恢复l端属性?br>        sTTY=`stty -g`

        #捕捉退Z?br>        trap "MyExit;" INT TERM
        trap "MyExitNoSub;" $sigExit

        #隐藏光标
        echo -ne "\033[?25l"


        while :
        do
                #d输入。注-s不回显,-nd一个字W立卌?br>                read -s -n 1 key

                aKey[0]=${aKey[1]}
                aKey[1]=${aKey[2]}
                aKey[2]=$key
                sig=0

                #判断输入了何U键
                if [[ $key == $cESC && ${aKey[1]} == $cESC ]]
                then
                        #ESC?br>                        MyExit
                elif [[ ${aKey[0]} == $cESC && ${aKey[1]} == "[" ]]
                then
                        if [[ $key == "A" ]]; then sig=$sigRotate        #<向上?gt;
                        elif [[ $key == "B" ]]; then sig=$sigDown        #<向下?gt;
                        elif [[ $key == "D" ]]; then sig=$sigLeft        #<向左?gt;
                        elif [[ $key == "C" ]]; then sig=$sigRight        #<向右?gt;
                        fi
                elif [[ $key == "W" || $key == "w" ]]; then sig=$sigRotate        #W, w
                elif [[ $key == "S" || $key == "s" ]]; then sig=$sigDown        #S, s
                elif [[ $key == "A" || $key == "a" ]]; then sig=$sigLeft        #A, a
                elif [[ $key == "D" || $key == "d" ]]; then sig=$sigRight        #D, d
                elif [[ "[$key]" == "[]" ]]; then sig=$sigAllDown        #I格?br>                elif [[ $key == "Q" || $key == "q" ]]                        #Q, q
                then
                        MyExit
                fi

                if [[ $sig != 0 ]]
                then
                        #向另一q程发送消?br>                        kill -$sig $pidDisplayer
                fi
        done
}

#退出前的恢?br>function MyExitNoSub()
{
        local y

        #恢复l端属?br>        stty $sTTY
        ((y = iTop + iTrayHeight + 4))

        #昄光标
        echo -e "\033[?25h\033[${y};0H"
        exit
}


function MyExit()
{
        #通知昄q程需要退?br>        kill -$sigExit $pidDisplayer

        MyExitNoSub
}


#处理昄和游戏流E的d?br>function RunAsDisplayer()
{
        local sigThis
        InitDraw

        #挂蝲各种信号的处理函?br>        trap "sig=$sigRotate;" $sigRotate
        trap "sig=$sigLeft;" $sigLeft
        trap "sig=$sigRight;" $sigRight
        trap "sig=$sigDown;" $sigDown
        trap "sig=$sigAllDown;" $sigAllDown
        trap "ShowExit;" $sigExit

        while :
        do
                #Ҏ当前的速度UiLevel不同Q设定相应的循环的次?br>                for ((i = 0; i < 21 - iLevel; i++))
                do
                        sleep 0.02
                        sigThis=$sig
                        sig=0

                        #Ҏsig变量判断是否接受到相应的信号
                        if ((sigThis == sigRotate)); then BoxRotate;        #旋{
                        elif ((sigThis == sigLeft)); then BoxLeft;        #左移一?br>                        elif ((sigThis == sigRight)); then BoxRight;        #右移一?br>                        elif ((sigThis == sigDown)); then BoxDown;        #下落一?br>                        elif ((sigThis == sigAllDown)); then BoxAllDown;        #下落到底
                        fi
                done
                #kill -$sigDown $$
                BoxDown        #下落一?br>        done
}


#BoxMove(y, x), 试是否可以把移动中的方块移?x, y)的位|? q回0则可? 1不可?br>function BoxMove()
{
        local j i x y xTest yTest
        yTest=$1
        xTest=$2
        for ((j = 0; j < 8; j += 2))
        do
                ((i = j + 1))
                ((y = ${boxCur[$j]} + yTest))
                ((x = ${boxCur[$i]} + xTest))
                if (( y < 0 || y >= iTrayHeight || x < 0 || x >= iTrayWidth))
                then
                        #撞到墙壁?br>                        return 1
                fi
                if ((${iMap[y * iTrayWidth + x]} != -1 ))
                then
                        #撞到其他已经存在的方块了
                        return 1
                fi
        done
        return 0;
}


#当前移动中的方块放到背景方块中?
#q计新的分数和速度U?即一ơ方块落到底?
function Box2Map()
{
        local j i x y xp yp line

        #当前移动中的方块放到背景方块中?br>        for ((j = 0; j < 8; j += 2))
        do
                ((i = j + 1))
                ((y = ${boxCur[$j]} + boxCurY))
                ((x = ${boxCur[$i]} + boxCurX))
                ((i = y * iTrayWidth + x))
                iMap[$i]=$cBoxCur
        done

        #消去可被消去的行
        line=0
        for ((j = 0; j < iTrayWidth * iTrayHeight; j += iTrayWidth))
        do
                for ((i = j + iTrayWidth - 1; i >= j; i--))
                do
                        if ((${iMap[$i]} == -1)); then break; fi
                done
                if ((i >= j)); then continue; fi

                ((line++))
                for ((i = j - 1; i >= 0; i--))
                do
                        ((x = i + iTrayWidth))
                        iMap[$x]=${iMap[$i]}
                done
                for ((i = 0; i < iTrayWidth; i++))
                do
                        iMap[$i]=-1
                done
        done

        if ((line == 0)); then return; fi

        #Ҏ消去的行数line计算分数和速度U?br>        ((x = iLeft + iTrayWidth * 2 + 7))
        ((y = iTop + 11))
        ((iScore += line * 2 - 1))
        #昄新的分数
        echo -ne "\033[1m\033[3${cScoreValue}m\033[${y};${x}H${iScore}         "
        if ((iScore % iScoreEachLevel < line * 2 - 1))
        then
                if ((iLevel < 20))
                then
                        ((iLevel++))
                        ((y = iTop + 14))
                        #昄新的速度U?br>                        echo -ne "\033[3${cScoreValue}m\033[${y};${x}H${iLevel}        "
                fi
        fi
        echo -ne "\033[0m"


        #重新昄背景方块
        for ((y = 0; y < iTrayHeight; y++))
        do
                ((yp = y + iTrayTop + 1))
                ((xp = iTrayLeft + 1))
                ((i = y * iTrayWidth))
                echo -ne "\033[${yp};${xp}H"
                for ((x = 0; x < iTrayWidth; x++))
                do
                        ((j = i + x))
                        if ((${iMap[$j]} == -1))
                        then
                                echo -ne "  "
                        else
                                echo -ne "\033[1m\033[7m\033[3${iMap[$j]}m\033[4${iMap[$j]}m[]\033[0m"
                        fi
                done
        done
}


#下落一?br>function BoxDown()
{
        local y s
        ((y = boxCurY + 1))        #新的y坐标
        if BoxMove $y $boxCurX        #试是否可以下落一?br>        then
                s="`DrawCurBox 0`"        #旧的方块抹?br>                ((boxCurY = y))
                s="$s`DrawCurBox 1`"        #昄新的下落后方?br>                echo -ne $s
        else
                #走到q儿, 如果不能下落?br>                Box2Map                #当前移动中的方块脓到背景方块中
                RandomBox        #产生新的方块
        fi
}

#左移一?br>function BoxLeft()
{
        local x s
        ((x = boxCurX - 1))
        if BoxMove $boxCurY $x
        then
                s=`DrawCurBox 0`
                ((boxCurX = x))
                s=$s`DrawCurBox 1`
                echo -ne $s
        fi
}

#右移一?br>function BoxRight()
{
        local x s
        ((x = boxCurX + 1))
        if BoxMove $boxCurY $x
        then
                s=`DrawCurBox 0`
                ((boxCurX = x))
                s=$s`DrawCurBox 1`
                echo -ne $s
        fi
}


#下落到底
function BoxAllDown()
{
        local k j i x y iDown s
        iDown=$iTrayHeight

        #计算一共需要下落多行
        for ((j = 0; j < 8; j += 2))
        do
                ((i = j + 1))
                ((y = ${boxCur[$j]} + boxCurY))
                ((x = ${boxCur[$i]} + boxCurX))
                for ((k = y + 1; k < iTrayHeight; k++))
                do
                        ((i = k * iTrayWidth + x))
                        if (( ${iMap[$i]} != -1)); then break; fi
                done
                ((k -= y + 1))
                if (( $iDown > $k )); then iDown=$k; fi
        done

        s=`DrawCurBox 0`        #旧的方块抹?br>        ((boxCurY += iDown))
        s=$s`DrawCurBox 1`        #昄新的下落后的方块
        echo -ne $s
        Box2Map                #当前移动中的方块脓到背景方块中
        RandomBox        #产生新的方块
}


#旋{方块
function BoxRotate()
{
        local iCount iTestRotate boxTest j i s
        iCount=${countBox[$iBoxCurType]}        #当前的方块经旋{可以产生的样式的数目

        #计算旋{后的新的样式
        ((iTestRotate = iBoxCurRotate + 1))
        if ((iTestRotate >= iCount))
        then
                ((iTestRotate = 0))
        fi

        #更新到新的样? 保存老的样式(但不昄)
        for ((j = 0, i = (${offsetBox[$iBoxCurType]} + $iTestRotate) * 8; j < 8; j++, i++))
        do
                boxTest[$j]=${boxCur[$j]}
                boxCur[$j]=${box[$i]}
        done

        if BoxMove $boxCurY $boxCurX        #试旋{后是否有I间攄?br>        then
                #抹去旧的方块
                for ((j = 0; j < 8; j++))
                do
                        boxCur[$j]=${boxTest[$j]}
                done
                s=`DrawCurBox 0`

                #M新的方块
                for ((j = 0, i = (${offsetBox[$iBoxCurType]} + $iTestRotate) * 8; j < 8; j++, i++))
                do
                        boxCur[$j]=${box[$i]}
                done
                s=$s`DrawCurBox 1`
                echo -ne $s
                iBoxCurRotate=$iTestRotate
        else
                #不能旋{Q还是l用老的样式
                for ((j = 0; j < 8; j++))
                do
                        boxCur[$j]=${boxTest[$j]}
                done
        fi
}


#DrawCurBox(bDraw), l制当前Ud中的方块, bDraw?, M, bDraw?, 抹去方块?br>function DrawCurBox()
{
        local i j t bDraw sBox s
        bDraw=$1

        s=""
        if (( bDraw == 0 ))
        then
                sBox="\040\040"
        else
                sBox="[]"
                s=$s"\033[1m\033[7m\033[3${cBoxCur}m\033[4${cBoxCur}m"
        fi

        for ((j = 0; j < 8; j += 2))
        do
                ((i = iTrayTop + 1 + ${boxCur[$j]} + boxCurY))
                ((t = iTrayLeft + 1 + 2 * (boxCurX + ${boxCur[$j + 1]})))
                #\033[y;xH, 光标?x, y)?br>                s=$s"\033[${i};${t}H${sBox}"
        done
        s=$s"\033[0m"
        echo -n $s
}


#更新新的方块
function RandomBox()
{
        local i j t

        #更新当前Ud的方?br>        iBoxCurType=${iBoxNewType}
        iBoxCurRotate=${iBoxNewRotate}
        cBoxCur=${cBoxNew}
        for ((j = 0; j < ${#boxNew[@]}; j++))
        do
                boxCur[$j]=${boxNew[$j]}
        done


        #昄当前Ud的方?br>        if (( ${#boxCur[@]} == 8 ))
        then
                #计算当前方块该从端哪一??出来
                for ((j = 0, t = 4; j < 8; j += 2))
                do
                        if ((${boxCur[$j]} < t)); then t=${boxCur[$j]}; fi
                done
                ((boxCurY = -t))
                for ((j = 1, i = -4, t = 20; j < 8; j += 2))
                do
                        if ((${boxCur[$j]} > i)); then i=${boxCur[$j]}; fi
                        if ((${boxCur[$j]} < t)); then t=${boxCur[$j]}; fi
                done
                ((boxCurX = (iTrayWidth - 1 - i - t) / 2))

                #昄当前Ud的方?br>                echo -ne `DrawCurBox 1`

                #如果方块一出来没处放QGame over!
                if ! BoxMove $boxCurY $boxCurX
                then
                        kill -$sigExit ${PPID}
                        ShowExit
                fi
        fi



        #清除双预显C的方块
        for ((j = 0; j < 4; j++))
        do
                ((i = iTop + 1 + j))
                ((t = iLeft + 2 * iTrayWidth + 7))
                echo -ne "\033[${i};${t}H        "
        done

        #随机产生新的方块
        ((iBoxNewType = RANDOM % ${#offsetBox[@]}))
        ((iBoxNewRotate = RANDOM % ${countBox[$iBoxNewType]}))
        for ((j = 0, i = (${offsetBox[$iBoxNewType]} + $iBoxNewRotate) * 8; j < 8; j++, i++))
        do
                boxNew[$j]=${box[$i]};
        done

        ((cBoxNew = ${colorTable[RANDOM % ${#colorTable[@]}]}))

        #昄双预显C的方块
        echo -ne "\033[1m\033[7m\033[3${cBoxNew}m\033[4${cBoxNew}m"
        for ((j = 0; j < 8; j += 2))
        do
                ((i = iTop + 1 + ${boxNew[$j]}))
                ((t = iLeft + 2 * iTrayWidth + 7 + 2 * ${boxNew[$j + 1]}))
                echo -ne "\033[${i};${t}H[]"
        done
        echo -ne "\033[0m"
}


#初始l制
function InitDraw()
{
        clear
        RandomBox        #随机产生方块Q这时右辚w昄H口中有方快?br>        RandomBox        #再随Z生方块,双预显C窗口中的方块被更新Q原先的方块开始下?br>        local i t1 t2 t3

        #昄Ҏ
        echo -ne "\033[1m"
        echo -ne "\033[3${cBorder}m\033[4${cBorder}m"

        ((t2 = iLeft + 1))
        ((t3 = iLeft + iTrayWidth * 2 + 3))
        for ((i = 0; i < iTrayHeight; i++))
        do
                ((t1 = i + iTop + 2))
                echo -ne "\033[${t1};${t2}H||"
                echo -ne "\033[${t1};${t3}H||"
        done

        ((t2 = iTop + iTrayHeight + 2))
        for ((i = 0; i < iTrayWidth + 2; i++))
        do
                ((t1 = i * 2 + iLeft + 1))
                echo -ne "\033[${iTrayTop};${t1}H=="
                echo -ne "\033[${t2};${t1}H=="
        done
        echo -ne "\033[0m"


        #昄"Score"?Level"字样
        echo -ne "\033[1m"
        ((t1 = iLeft + iTrayWidth * 2 + 7))
        ((t2 = iTop + 10))
        echo -ne "\033[3${cScore}m\033[${t2};${t1}HScore"
        ((t2 = iTop + 11))
        echo -ne "\033[3${cScoreValue}m\033[${t2};${t1}H${iScore}"
        ((t2 = iTop + 13))
        echo -ne "\033[3${cScore}m\033[${t2};${t1}HLevel"
        ((t2 = iTop + 14))
        echo -ne "\033[3${cScoreValue}m\033[${t2};${t1}H${iLevel}"
        echo -ne "\033[0m"
}


#退出时昄GameOVer!
function ShowExit()
{
        local y
        ((y = iTrayHeight + iTrayTop + 3))
        echo -e "\033[${y};0HGameOver!\033[0m"
        exit
}


#昄用法.
function Usage
{
        cat << EOF
Usage: $APP_NAME
Start tetris game.

  -h, --help              display this help and exit
      --version           output version information and exit
EOF
}


#游戏ȝ序在q儿开?
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
        Usage
elif [[ "$1" == "--version" ]]; then
        echo "$APP_NAME $APP_VERSION"
elif [[ "$1" == "--show" ]]; then
        #当发现具有参?-showӞq行昄函数
        RunAsDisplayer
else
        bash $0 --show&        #以参?-show本E序再运行一?br>        RunAsKeyReceiver $!        #以上一行生的q程的进E号作ؓ参数
fi


from:
http://bbs.chinaunix.net/thread-184858-1-1.html


chatler 2010-03-26 11:51 发表评论
]]>ANSI控制?/title><link>http://www.shnenglu.com/beautykingdom/archive/2010/03/26/110577.html</link><dc:creator>chatler</dc:creator><author>chatler</author><pubDate>Fri, 26 Mar 2010 03:41:00 GMT</pubDate><guid>http://www.shnenglu.com/beautykingdom/archive/2010/03/26/110577.html</guid><wfw:comment>http://www.shnenglu.com/beautykingdom/comments/110577.html</wfw:comment><comments>http://www.shnenglu.com/beautykingdom/archive/2010/03/26/110577.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/beautykingdom/comments/commentRss/110577.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/beautykingdom/services/trackbacks/110577.html</trackback:ping><description><![CDATA[ANSI控制码的说明<br> 例如:<br>   echo -ne "\33[32m" 可以字W的昄颜色改ؓl色<br>   echo -ne "\33[3;1H" 可以光标移到第3行第1列处<br> 具体的摘抄一些如下:<br> \33[0m  关闭所有属?br> \33[1m  讄高亮?br> \33[4m  下划U?br> \33[5m  闪烁<br> \33[7m  反显<br> \33[8m  消隐<br> \33[30m -- \33[37m  讄前景?br> \33[40m -- \33[47m  讄背景?br> \33[nA  光标上移n?br> \33[nB  光标下移n?br> \33[nC  光标右移n?br> \33[nD  光标左移n?br> \33[y;xH讄光标位置<br> \33[2J  清屏<br> \33[K   清除从光标到行尾的内?br> \33[s   保存光标位置<br> \33[u   恢复光标位置<br> \33[?25l  隐藏光标<br> \33[?25h  昄光标<br><br>不同的shell,转义是不同的,<br> /home/lee#echo "\\033[32mddd"<br> <font color="green">ddd<br> /home/lee#<br> /home/lee#bash<br> /home/lee#echo "\\033[33maddd"<br> \033[33maddd<br> /home/lee#exit<br> /home/lee#echo "\\033[34maddd"</font><br> <font color="blue">addd<br> /home/lee#echo $0<br> -ksh<br> /home/lee#<br><br>from:<br>http://bbs.chinaunix.net/thread-207837-1-1.html<br></font><img src ="http://www.shnenglu.com/beautykingdom/aggbug/110577.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/beautykingdom/" target="_blank">chatler</a> 2010-03-26 11:41 <a href="http://www.shnenglu.com/beautykingdom/archive/2010/03/26/110577.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>shell基础二:查找技?find及xargs的?/title><link>http://www.shnenglu.com/beautykingdom/archive/2010/03/17/109880.html</link><dc:creator>chatler</dc:creator><author>chatler</author><pubDate>Wed, 17 Mar 2010 03:14:00 GMT</pubDate><guid>http://www.shnenglu.com/beautykingdom/archive/2010/03/17/109880.html</guid><wfw:comment>http://www.shnenglu.com/beautykingdom/comments/109880.html</wfw:comment><comments>http://www.shnenglu.com/beautykingdom/archive/2010/03/17/109880.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/beautykingdom/comments/commentRss/109880.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/beautykingdom/services/trackbacks/109880.html</trackback:ping><description><![CDATA[     摘要: Normal 0 7.8 ?0 2 false false false MicrosoftInternetExplorer4 st1\:*{behavior:url(#ieooui) } /* Style Definitions */ table.MsoNormalT...  <a href='http://www.shnenglu.com/beautykingdom/archive/2010/03/17/109880.html'>阅读全文</a><img src ="http://www.shnenglu.com/beautykingdom/aggbug/109880.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/beautykingdom/" target="_blank">chatler</a> 2010-03-17 11:14 <a href="http://www.shnenglu.com/beautykingdom/archive/2010/03/17/109880.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>五大非常见Linux命ohttp://www.shnenglu.com/beautykingdom/archive/2010/03/06/109024.htmlchatlerchatlerSat, 06 Mar 2010 03:26:00 GMThttp://www.shnenglu.com/beautykingdom/archive/2010/03/06/109024.htmlhttp://www.shnenglu.com/beautykingdom/comments/109024.htmlhttp://www.shnenglu.com/beautykingdom/archive/2010/03/06/109024.html#Feedback0http://www.shnenglu.com/beautykingdom/comments/commentRss/109024.htmlhttp://www.shnenglu.com/beautykingdom/services/trackbacks/109024.htmlLinux有大量的命o行工P从每天都会用的ls、cd以及psq些工具Q到您可能还没有使用q,或者甚x有听说过的不常见的工兗?/p>

  我们看一下五个不常见Q但可以让您的用更L的工兗我们会单地看看每一个命令及其标志和参数Q但请不要忘了对每一个命令用man命oQ去获取所有可能的标志和参C息?/p>

  logsave

  我们查看的W一个工hlogsave。logsave命o可以一个命令的输出保存C个日志文件中Q?/p>

  $ logsave /var/log/partsize df –h

  q里Qlogsave命odf命o的输Z存到/var/log/partsize文g中,同时会添加一个时间戳q将命o的执行结果输出到标准输出?/p>

听v来ƈ不是那么的有,是吗QlogsaveҎ的魔力在于,如果文gQ在q个例子中是/var/log/partsizeQƈ不存在,那么 logsave会在内存中将数据q行排队Q等待该文g的生。对于在启动q程中,当您在对一个还没有挂蝲上的分区q行写操作时Q用logsave去跟t命 令的执行输出是非常有用的。ؓ了保存可能会丢失的命令行输出Q我l常在自动配|和引导q程中,使用logsave?/p>

  diff3

下一个工hdiff3命o。您可能已经使用qdiff命oȝ成文件之间的差异。相对于diff的两个文Ӟdiff3可以对三个文件执行同L? 能,但包括diff中的一些更复杂的选项。让我们看一个简单的例子。我们有三个文gQcat、dog以及mouseQ它们各自包含一个字W串。我们可以用 diff3Ҏ有的三个文gq行比较Q?/p>

$ diff3 dog cat mouse
====
1:1c
  This is a dog
2:1c
  This is a cat
3:1c
  This is a mouse

  diff3命o昄了三个文件中不同的字W串。您也可以用“-”标记代表一个文件。这会把标准输入和其他文gq行比较?

  您也可以使用-A标记Q在所有的文g里面Q去合ƈ不同Qƈ对Q何冲H之处进行高亮显C?/p>

$ diff3 -A dog cat mouse
1a
||||||| cat
This is a cat
=======
This is a mouse
>>>>>>> mouse
.
0a
<<<<<<< dog
.

  pstree

您可能已l在您的L上,使用qpsd出所有的q程。但您可能还没有听说qpstree——一个用于以树的形式昄您的q程的命令。一个进E或者从 initq程Q从一个您可以指定的PIDQ进EIDQ分支出来,或者从一个您可以指定的用户分支出来。每一个进E及其子q程如下所C:

pstree命o
 
  pstree命o也包括一些您可以使用的命令行标志。比?a标志会显CE所使用的命令行Q?p标志会在树中dq程的进EID?/p>

  nl

  nl命o很少有h知道Q但却可以执行一个很漂亮的小功能——它在输Zd行号。让我们看一个简单的例子Q对一个叫做dog的文件执行nl命o?/p>

$ nl dog
1 This is a dog
2 This is not a dog

  您可以看到nl获取了dog文g的内容,q在输出中添加了行号。然后,您可以将q些输出通过道攑ֈ一个新文g中?/p>

  $ nl dog > dog_numbered

  然后Q我们就可以昄q个带有新的行号内容的文Ӟ

$ cat dog_numbered
1 This is a dog
2 This is not a dog

  split

  我们要看的最后一个命令是split。split命o通常Z寸文件分割ؓ多个片段。我使用q个命o,d大的日志文g分割为更好管理的日志片段Q例如:

  $ split --bytes=1m /tmp/largelogfile /tmp/smallerfile

  split命o有根据字节数和行数对文gq行分割的参数。这?我们通过指定--bytes=1m参数Q将大的日志文g分割?M字节的块Q您可以指定bM表字节,k代表千字节,g代表十亿字节Q?/p>

  我们可以像这h据行数对文gq行分割Q?/p>

  $ split --lines=1000 /tmp/largelogfile /tmp/smallerfile

  q里Q文件会被分为多?000行的块?

在我们的例子中,会将每个块都存在/tmp目录下,其文件名会包含一个前~smallerfile。第一个文件ؓsmallerfileaaQ第二个? smallerfileab{等。您也可以?d标记Q去使用数字而不是通过字母的增长来对块q行计数。最后,除了可以指定一个文Ӟ您也可以使用 “-”去让split命o以标准输入ؓ输入Qƈ分割为独立的文g?/p>
from:
http://www.searchsv.com.cn/showcontent_31396.htm



chatler 2010-03-06 11:26 发表评论
]]>
LINUX命oxargs的简单应用及举例http://www.shnenglu.com/beautykingdom/archive/2010/02/17/107949.htmlchatlerchatlerTue, 16 Feb 2010 20:11:00 GMThttp://www.shnenglu.com/beautykingdom/archive/2010/02/17/107949.htmlhttp://www.shnenglu.com/beautykingdom/comments/107949.htmlhttp://www.shnenglu.com/beautykingdom/archive/2010/02/17/107949.html#Feedback0http://www.shnenglu.com/beautykingdom/comments/commentRss/107949.htmlhttp://www.shnenglu.com/beautykingdom/services/trackbacks/107949.htmlxargs
大多?Linux 命o都会产生输出Q文件列表、字W串列表{。但如果要用其他某个命令ƈ前一个命令的输出作ؓ参数该怎么办?? 如,file 命o昄文gcdQ可执行文g、ascii 文本{)Q您可以处理输出Q其仅昄文g名,现在您希望将q些名称传递给 ls -l 命o以查看时间戳记。xargs 命o是用来完成此项工作的。它允许您对输出执行其他某些命o。记住下面这个来自于W?1 部分中的语法Q?

file -Lz * | grep ASCII | cut -d":" -f1 | xargs ls -ltr

让我们来剖析q个命o字符丌Ӏ第一个,file -Lz *Q用于查找是W号链接或者经q压~的文g。它输Z递给下一个命?grep ASCIIQ该命o在其中搜?"ASCII" 字符串ƈ产生如下所C的输出Q?
alert_DBA102.log:        ASCII English text
alert_DBA102.log.Z:      ASCII text (compress'd data 16 bits)
dba102_asmb_12307.trc.Z: ASCII English text (compress'd data 16 bits)
dba102_asmb_20653.trc.Z: ASCII English text (compress'd data 16 bits)

׃我们只对文g名感兴趣Q因此我们应用下一个命?cut -d":" -f1Q仅昄W一个字D:
alert_DBA102.log
alert_DBA102.log.Z
dba102_asmb_12307.trc.Z
dba102_asmb_20653.trc.Z

现在Q我们希望?ls -l 命oQ将上述列表作ؓ参数q行传递,一ơ传递一个。xargs 命o允许您这样做。最后一部分Qxargs ls -ltrQ用于接收输出ƈ对其执行 ls -ltr 命oQ如下所C:

ls -ltr alert_DBA102.log
ls -ltr alert_DBA102.log.Z
ls -ltr dba102_asmb_12307.trc.Z
ls -ltr dba102_asmb_20653.trc.Z

因此Qxargs 本n虽然没有多大用处Q但在与其他命o相结合时Q它的功能非常强大?/font>

下面是另一个示例,我们希望计算q些文g中的行数Q?/font>

$ file * | grep ASCII | cut -d":" -f1 | xargs wc -l
47853 alert_DBA102.log
     19 dba102_cjq0_14493.trc
29053 dba102_mmnl_14497.trc
    154 dba102_reco_14491.trc
     43 dba102_rvwr_14518.trc
77122 total

Q注Q上qCQ务还可用以下命o完成Q)

$ wc -l ‘file * | grep ASCII | cut -d":" -f1 | grep ASCII | cut -d":" -f1‘

?xargs 版本用于阐释概念。Linux 可以用几U方法来完成同一个Q务;请用最适合您的情况的方法?/font>

使用该方法,您可以快速重命名目录中的文g?/font>

$ ls | xargs -t -i mv {} {}.bak

-i 选项告诉 xargs 用每的名称替换 {}?t 选项指示 xargs 先打印命令,然后再执行?/font>

另一个非常有用的操作是当您?vi 打开要编辑的文gӞ

$ file * | grep ASCII | cut -d":" -f1 | xargs vi

该命令?vi 逐个打开文g。当您希望搜索多个文件ƈ打开它们q行~辑Ӟ使用该命令非常方ѝ?

它还有几个选项。最有用的可能是 -p 选项Q它使操作具有可交互性:

$ file * | grep ASCII | cut -d":" -f1 | xargs -p vi
vi alert_DBA102.log dba102_cjq0_14493.trc dba102_mmnl_14497.trc   dba102_reco_14491.trc dba102_rvwr_14518.trc ?...

此处?xarg 要求您在q行每个命o之前q行认。如果您按下 "y"Q则执行命o。当您对文gq行某些可能有破坏且不可恢复的操作(如删除或覆盖Q时Q您会发现该选项非常有用?/font>

-t 选项使用一个详l模式;它显Cq行的命令,是调试过E中一个非常有帮助的选项?/font>

如果传递给 xargs 的输ZؓI怎么办?考虑以下命oQ?/font>

$ file * | grep SSSSSS | cut -d":" -f1 | xargs -t wc -l
wc -l
            0
$

在此处,搜烦 "SSSSSS" 后没有匹配的内容Q因?xargs 的输入均为空Q如W二行所C(׃我们使用 -t q个详细选项而生的l果Q。虽然这可能会有所帮助Q但在某些情况下Q如果没有要处理的内容,您可能希望停?xargsQ如果是q样Q可以?-r 选项Q?
$ file * | grep SSSSSS | cut -d":" -f1 | xargs -t -r wc -l
$

如果没有要运行的内容Q该命o退出?/font>

假设您希望?rm 命oQ该命o作?xargs 命o的参敎ͼ删除文g。然而,rm 只能接受有限数量的参数。如果您的参数列表超限制怎么办?xargs ?-n 选项限制单个命o行的参数个数?

下面昄了如何限制每个命令行仅用两个参敎ͼ即?xargs ls -ltr 传递五个文Ӟ但每ơ向 ls -ltr 仅传递两个文件?/font>

$ file * | grep ASCII | cut -d":" -f1 | xargs -t -n2 ls -ltr
ls -ltr alert_DBA102.log dba102_cjq0_14493.trc
-rw-r-----    1 oracle   dba           738 Aug 10 19:18 dba102_cjq0_14493.trc
-rw-r--r--    1 oracle   dba       2410225 Aug 13 05:31 alert_DBA102.log
ls -ltr dba102_mmnl_14497.trc dba102_reco_14491.trc
-rw-r-----    1 oracle   dba       5386163 Aug 10 17:55 dba102_mmnl_14497.trc
-rw-r-----    1 oracle   dba          6808 Aug 13 05:21 dba102_reco_14491.trc
ls -ltr dba102_rvwr_14518.trc
-rw-r-----    1 oracle   dba          2087 Aug 10 04:30 dba102_rvwr_14518.trc

使用该方法,您可以快速重命名目录中的文g?

$ ls | xargs -t -i mv {} {}.bak

-i 选项告诉 xargs 用每的名称替换 {}?


? 需要将一个用.svn理的项目改成由CVS来管理,因此Q在导入整个目到CVS中之前,我需要删除所有目录下以及子孙目录下的.svn目录?svn 目录下的的子目录和文件。我一直寻找一U最单的ҎQ最后写了一个程序去q这事情。结果同事告诉我只需要一条指令就可以了:
find -name '.svn' |xargs rm -rf
q个教训非常惨重Q我一生讨厌傻瓜,可那一d现自己是最大的ȝQ?br>
是的Q虽然我们——至是我,天天使用LINUX但是真的是在高效的用这个系l吗Q不Q很多时候ƈ没有花时间去研究它,使用一些固有愚蠢的方式和思维模式在用这个系l?br>

1. 建立多目录:

mkidr 指o用来建立目录Q事实上Q我们一直都是这么干的。但是在q么使用的时候我们ƈ没有ȝ它的那些参数提供了哪些额外的功能.

mkidr -p /share/dragon   ; 在根目录下徏立share目录Qƈ?share目录下徏立dragon目录?/font>mkdir -p guicmd/{bin,lib,src,share/version,doc/{html,pdf,info,man}}
;用来建立一个复杂的目目录树?br>
2.find 配合xargs使用Q?br>
find -name '.svn' |xargs rm -rf ;q个不用说了Q就是我前面提到的?br>xargs更加象一个筛选器Q将W合道传递过来的文g名的内容一q处理掉Q这是一个极度高效的Ҏ?/font>


from: http://www.shnenglu.com/prayer/archive/2009/11/17/90188.html#101210



chatler 2010-02-17 04:11 发表评论
]]>
如何准确的截取出IPD?/title><link>http://www.shnenglu.com/beautykingdom/archive/2010/02/16/107925.html</link><dc:creator>chatler</dc:creator><author>chatler</author><pubDate>Tue, 16 Feb 2010 10:19:00 GMT</pubDate><guid>http://www.shnenglu.com/beautykingdom/archive/2010/02/16/107925.html</guid><wfw:comment>http://www.shnenglu.com/beautykingdom/comments/107925.html</wfw:comment><comments>http://www.shnenglu.com/beautykingdom/archive/2010/02/16/107925.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/beautykingdom/comments/commentRss/107925.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/beautykingdom/services/trackbacks/107925.html</trackback:ping><description><![CDATA[比如用到下面的命令得Z一堆信息,如何获取到本地和q端的ip?div><div> netstat -an | grep tcp</div><div>tcp        0      0 0.0.0.0:5989            0.0.0.0:*               LISTEN</div><div>tcp        0      0 127.0.0.1:427           0.0.0.0:*               LISTEN</div><div>tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN</div><div>tcp        0      0 127.0.0.1:2544          0.0.0.0:*               LISTEN</div><div>tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN</div><div>tcp        0      0 :::22                   :::*                    LISTEN</div><div>tcp        0      0 ::1:25                  :::*                    LISTEN</div><div>tcp        0     52 192.168.2.4:22          192.168.2.2:3107        ESTABLISHED</div><div>tcp        0      0 192.168.2.4:22          192.168.2.100:2184      ESTABLISHED</div><div>可以考虑用awk和cut的结?/div><div><div>netstat -an | grep tcp | awk '{print $5}' | cut -d: -f1</div><div>得出q端ip的信?/div><div><div>0.0.0.0</div><div>0.0.0.0</div><div>0.0.0.0</div><div>0.0.0.0</div><div>0.0.0.0</div><div><br></div><div><br></div><div>192.168.2.2</div><div>192.168.2.100</div><div>若是本地的ip信息也可以用cM的方法炮Ӟ只是awk里的$n有点变化|了?/div></div></div></div><img src ="http://www.shnenglu.com/beautykingdom/aggbug/107925.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/beautykingdom/" target="_blank">chatler</a> 2010-02-16 18:19 <a href="http://www.shnenglu.com/beautykingdom/archive/2010/02/16/107925.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>shell中管道两边的q程是怎么通信?/title><link>http://www.shnenglu.com/beautykingdom/archive/2010/02/13/107824.html</link><dc:creator>chatler</dc:creator><author>chatler</author><pubDate>Sat, 13 Feb 2010 15:42:00 GMT</pubDate><guid>http://www.shnenglu.com/beautykingdom/archive/2010/02/13/107824.html</guid><wfw:comment>http://www.shnenglu.com/beautykingdom/comments/107824.html</wfw:comment><comments>http://www.shnenglu.com/beautykingdom/archive/2010/02/13/107824.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/beautykingdom/comments/commentRss/107824.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/beautykingdom/services/trackbacks/107824.html</trackback:ping><description><![CDATA[ <span style="font-family: verdana, arial, sans-serif; font-size: 13px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; ">     要执行一个简单命?shell 首先复制自nQ然?shell {待实际上执行命令的 subshell Q子shellQ完成,?subshell 中做重定向和执行 exec pȝ调用Q用指定E序的代码段和数据段替代 shell 代码D和数据D,q程 id {元信息不变?nbsp;<br>     道U?a | b 执行Qshell 创徏一个管道,复制一?subshell, 在其中把输出标准重定向到道写端然后 exec aQshell 不等待这?subshell 执行完成; shell 接着复制一?subshellQ在其中把标准输入重定向到管道读端然?exec b, shell {待它这?subshell 完成?nbsp;<br>     ?(...) 方式执行命o时候涉及到q一步的q程复制Qshell 在复?subshell 之后不等待其完成Qsubshell 在执行除了最后一个命令之外所有命令的时候都复制一?subsubshellQ在其中做重定向?exec, subshell 在自w中重定向和 exec 最后一个命?                  如果道?subshell( exec a) 创徏Q那么subshell(exec b)无法通过l承得到该管道描q符Q从而进行重定向Q那么只能用用named pipe了? </span> <div><span style="font-family: verdana, arial, sans-serif; font-size: 13px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; ">fromQlinuxforum</span></div><img src ="http://www.shnenglu.com/beautykingdom/aggbug/107824.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/beautykingdom/" target="_blank">chatler</a> 2010-02-13 23:42 <a href="http://www.shnenglu.com/beautykingdom/archive/2010/02/13/107824.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GNU Linux核心命o和工L源代码\?/title><link>http://www.shnenglu.com/beautykingdom/archive/2010/01/01/104607.html</link><dc:creator>chatler</dc:creator><author>chatler</author><pubDate>Fri, 01 Jan 2010 08:09:00 GMT</pubDate><guid>http://www.shnenglu.com/beautykingdom/archive/2010/01/01/104607.html</guid><wfw:comment>http://www.shnenglu.com/beautykingdom/comments/104607.html</wfw:comment><comments>http://www.shnenglu.com/beautykingdom/archive/2010/01/01/104607.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/beautykingdom/comments/commentRss/104607.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/beautykingdom/services/trackbacks/104607.html</trackback:ping><description><![CDATA[<p>Commands and Utilities</p> <p>--------------------------------------------------------------------------------</p> <p>The table below lists all of the commands and utilities set forth in chapter 17 of the Linux Standard Base specification. Also listed are the source code packages used by Architect to provide the commands as well as the primary download location for the source code. </p> <p>command   source package  primary download site<br>--------------------------------------------------------------------------------<br>[   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>ar   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>at   at   <a >http://www.happy-monkey.net/architect/src</a><br>awk   gawk   <a href="ftp://ftp.gnu.org/gnu/gawk">ftp.gnu.org/gnu/gawk</a><br>basename  coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>batch   at   <a >http://www.happy-monkey.net/architect/src</a><br>bc   bc   <a href="ftp://ftp.gnu.org/gnu/bc">ftp.gnu.org/gnu/bc</a><br>cat   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>chfn   shadow   <a href="ftp://ftp.pld-linux.org/software/shadow">ftp.pld-linux.org/software/shadow</a><br>chgrp   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>chmod   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>chown   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>chsh   shadow   <a href="ftp://ftp.pld-linux.org/software/shadow">ftp.pld-linux.org/software/shadow</a><br>cksum   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>cmp   diffutils  <a href="ftp://ftp.gnu.org/gnu/diffutils">ftp.gnu.org/gnu/diffutils</a><br>col   util-linux  <a href="ftp://ftp.win.tue.nl/pub/linux-local/utils/util-linux">ftp.win.tue.nl/pub/linux-local/utils/util-linux</a><br>comm   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>cp   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>cpio   cpio   <a href="ftp://ftp.gnu.org/gnu/cpio">ftp.gnu.org/gnu/cpio</a><br>crontab   dcron   <a href="ftp://ftp.ibiblio.org/pub/linux/system/daemons/cron">ftp.ibiblio.org/pub/linux/system/daemons/cron</a><br>csplit   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>cut   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>date   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>dd   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>df   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>diff   diffutils  <a href="ftp://ftp.gnu.org/gnu/diffutils">ftp.gnu.org/gnu/diffutils</a><br>dirname   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>dmesg   util-linux  <a href="ftp://ftp.win.tue.nl/pub/linux-local/utils/util-linux">ftp.win.tue.nl/pub/linux-local/utils/util-linux</a><br>du   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>echo   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>egrep   grep   <a href="ftp://ftp.gnu.org/gnu/grep">ftp.gnu.org/gnu/grep</a><br>env   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>expand   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>expr   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>false   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>fgrep   grep   <a href="ftp://ftp.gnu.org/gnu/grep">ftp.gnu.org/gnu/grep</a><br>file   file   <a href="ftp://ftp.astron.com/pub/file">ftp.astron.com/pub/file</a><br>fold   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>fuser   psmisc   <a >http://sourceforge.net/projects/psmisc</a><br>gencat   man   <a href="ftp://ftp.win.tue.nl/pub/linux-local/utils/man">ftp.win.tue.nl/pub/linux-local/utils/man</a><br>getconf   glibc   <a href="ftp://ftp.gnu.org/gnu/glibc">ftp.gnu.org/gnu/glibc</a><br>gettext   gettext   <a href="ftp://ftp.gnu.org/gnu/gettext">ftp.gnu.org/gnu/gettext</a><br>grep   grep   <a href="ftp://ftp.gnu.org/gnu/grep">ftp.gnu.org/gnu/grep</a><br>groupadd  shadow   <a href="ftp://ftp.pld-linux.org/software/shadow">ftp.pld-linux.org/software/shadow</a><br>groupdel  shadow   <a href="ftp://ftp.pld-linux.org/software/shadow">ftp.pld-linux.org/software/shadow</a><br>groupmod  shadow   <a href="ftp://ftp.pld-linux.org/software/shadow">ftp.pld-linux.org/software/shadow</a><br>groups   shadow   <a href="ftp://ftp.pld-linux.org/software/shadow">ftp.pld-linux.org/software/shadow</a><br>gunzip   gzip   <a href="ftp://ftp.gnu.org/gnu/gzip">ftp.gnu.org/gnu/gzip</a><br>gzip   gzip   <a href="ftp://ftp.gnu.org/gnu/gzip">ftp.gnu.org/gnu/gzip</a><br>head   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>hostname  coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>iconv   glibc   <a href="ftp://ftp.gnu.org/gnu/glibc">ftp.gnu.org/gnu/glibc</a><br>id   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>install   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>install_initd  [not implemented]       [N/A]<br>ipcrm   util-linux  <a href="ftp://ftp.win.tue.nl/pub/linux-local/utils/util-linux">ftp.win.tue.nl/pub/linux-local/utils/util-linux</a><br>join   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>kill   procps   <a >http://procps.sourceforge.net</a><br>killall   psmisc   <a >http://sourceforge.net/projects/psmisc</a><br>ln   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>locale   glibc   <a href="ftp://ftp.gnu.org/gnu/glibc">ftp.gnu.org/gnu/glibc</a><br>localedef  glibc   <a href="ftp://ftp.gnu.org/gnu/glibc">ftp.gnu.org/gnu/glibc</a><br>logname   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>lpr   LPRng   <a href="ftp://ftp.lprng.com/pub/LPRng/LPRng">ftp.lprng.com/pub/LPRng/LPRng</a><br>ls   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>lsb_release  [not implemented] [N/A]<br>m4   m4   <a href="ftp://ftp.gnu.org/gnu/m4">ftp.gnu.org/gnu/m4</a><br>make   make   <a href="ftp://ftp.gnu.org/gnu/make">ftp.gnu.org/gnu/make</a><br>man   man   <a href="ftp://ftp.win.tue.nl/pub/linux-local/utils/man">ftp.win.tue.nl/pub/linux-local/utils/man</a><br>md5sum   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>mkdir   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>mkfifo   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>mknod   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>mktemp   mktemp   <a href="ftp://ftp.mktemp.org/pub/mktemp">ftp.mktemp.org/pub/mktemp</a><br>more   less   <a href="ftp://ftp.gnu.org/gnu/less">ftp.gnu.org/gnu/less</a><br>mount   util-linux  <a href="ftp://ftp.win.tue.nl/pub/linux-local/utils/util-linux">ftp.win.tue.nl/pub/linux-local/utils/util-linux</a><br>msgfmt   getttext  <a href="ftp://ftp.gnu.org/gnu/gettext">ftp.gnu.org/gnu/gettext</a><br>mv   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>newgrp   shadow   <a href="ftp://ftp.pld-linux.org/software/shadow">ftp.pld-linux.org/software/shadow</a><br>nice   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>nl   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>nohup   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>od   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>passwd   shadow   <a href="ftp://ftp.pld-linux.org/software/shadow">ftp.pld-linux.org/software/shadow</a><br>paste   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>patch   patch   <a href="ftp://ftp.gnu.org/gnu/patch">ftp.gnu.org/gnu/patch</a><br>pathck   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>pidof   procps   <a >http://procps.sourceforge.net</a><br>pr   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>printf   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>ps   procps   <a >http://procps.sourceforge.net</a><br>pwd   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>remove_initd  [not implemented] [N/A]<br>renice   util-linux  <a href="ftp://ftp.win.tue.nl/pub/linux-local/utils/util-linux">ftp.win.tue.nl/pub/linux-local/utils/util-linux</a><br>rm   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>rmdir   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>rsync   rsync   <a href="ftp://ftp.samba.org/pub/rsync">ftp.samba.org/pub/rsync</a><br>sed   sed   <a href="ftp://ftp.gnu.org/gnu/sed">ftp.gnu.org/gnu/sed</a><br>sendmail  postfix   <a href="ftp://ftp.porcupine.org/mirrors/postfix-release/official">ftp.porcupine.org/mirrors/postfix-release/official</a><br>sh   bash   <a href="ftp://ftp.gnu.org/gnu/bash">ftp.gnu.org/gnu/bash</a><br>shutdown  sysvinit  <a href="ftp://ftp.cistron.nl/pub/people/miquels/sysvinit">ftp.cistron.nl/pub/people/miquels/sysvinit</a><br>sleep   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>sort   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>split   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>strip   binutils  <a href="ftp://ftp.gnu.org/gnu/binutils">ftp.gnu.org/gnu/binutils</a><br>stty   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>su   shadow   <a href="ftp://ftp.pld-linux.org/software/shadow">ftp.pld-linux.org/software/shadow</a><br>sum   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>sync   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>tail   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>tar   tar   <a href="ftp://ftp.gnu.org/gnu/tar">ftp.gnu.org/gnu/tar</a><br>tee   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>test   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>time   time   <a href="ftp://ftp.gnu.org/gnu/time">ftp.gnu.org/gnu/time</a><br>touch   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>tr   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>true   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>tsort   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>tty   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>umount   util-linux  <a href="ftp://ftp.win.tue.nl/pub/linux-local/utils/util-linux">ftp.win.tue.nl/pub/linux-local/utils/util-linux</a><br>uname   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>unexpand  coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>uniq   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>useradd   shadow   <a href="ftp://ftp.pld-linux.org/software/shadow">ftp.pld-linux.org/software/shadow</a><br>userdel   shadow   <a href="ftp://ftp.pld-linux.org/software/shadow">ftp.pld-linux.org/software/shadow</a><br>usermod   shadow   <a href="ftp://ftp.pld-linux.org/software/shadow">ftp.pld-linux.org/software/shadow</a><br>wc   coreutils  <a href="ftp://ftp.gnu.org/gnu/coreutils">ftp.gnu.org/gnu/coreutils</a><br>xargs   findutils  <a href="ftp://ftp.gnu.org/gnu/findutils">ftp.gnu.org/gnu/findutils</a><br>from:<br><a >http://blog.chinaunix.net/u2/76292/showart.php?id=2135340</a></p> <img src ="http://www.shnenglu.com/beautykingdom/aggbug/104607.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/beautykingdom/" target="_blank">chatler</a> 2010-01-01 16:09 <a href="http://www.shnenglu.com/beautykingdom/archive/2010/01/01/104607.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ftp下蝲文g完整性校?shell脚本http://www.shnenglu.com/beautykingdom/archive/2009/11/23/101740.htmlchatlerchatlerMon, 23 Nov 2009 13:23:00 GMThttp://www.shnenglu.com/beautykingdom/archive/2009/11/23/101740.htmlhttp://www.shnenglu.com/beautykingdom/comments/101740.htmlhttp://www.shnenglu.com/beautykingdom/archive/2009/11/23/101740.html#Feedback0http://www.shnenglu.com/beautykingdom/comments/commentRss/101740.htmlhttp://www.shnenglu.com/beautykingdom/services/trackbacks/101740.html#!/bin/sh                       
#date=20080916                  
#echo $date                     
ftp -i -n 192.168.1.161 <<EOF  
user name password             
cd bj                           
ls *20080916* 20080916          
bye                             
EOF                             
aaaa=`ls *20080916* |wc -l`     
echo $aaaa                      
bbbb=`cat  20080916|wc -l`      
echo $bbbb                      
if [ $aaaa -eq $bbbb ]          
then                            
echo "ftp transfered completely "
else                            
echo "ftp transfered error"     
 fi    

 
 
#!/bin/sh                                                              
ftp -i -n 192.168.1.152 <<EOF                                         
user name password                                                     
ls -lt file1                                                           
bye                                                                    
EOF                                                                    
ls -lt >file2                                                          
awk '{print $5}'file2 | while read tty                                 
do\                                                                    
awk 'BEGIN {...}END{name="'tty'";\                                     
if($5==$name)\                                                         
printf("%s",zhengque);\                                                
else\                                                                  
printf("%s transfer error\n",$9);\                                     
printf("the size of source file is %d,the size of this file after ftp\ 
transferred is %d",$name,$5);\                                         
}\                                                                     
' file1\                                                               
done\
转自Q?br>http://blog.chinaunix.net/u/28584/showart.php?id=1211619

chatler 2009-11-23 21:23 发表评论
]]>
SED用法结http://www.shnenglu.com/beautykingdom/archive/2009/11/23/101738.htmlchatlerchatlerMon, 23 Nov 2009 13:21:00 GMThttp://www.shnenglu.com/beautykingdom/archive/2009/11/23/101738.htmlhttp://www.shnenglu.com/beautykingdom/comments/101738.htmlhttp://www.shnenglu.com/beautykingdom/archive/2009/11/23/101738.html#Feedback0http://www.shnenglu.com/beautykingdom/comments/commentRss/101738.htmlhttp://www.shnenglu.com/beautykingdom/services/trackbacks/101738.html

quote.txt

The honeysuckle hand played all night long for only $90.

It was an evening of splendid music and company.

Too bad the disco floor fell through at 23:10.

The local nurse Miss P.Neave was in attendance.

昄?/p>

$sed -n '2p' quote.txt

范围

$sed -n '1,3p' quote.txt

匚w单词

$sed -n '/The/'p quote.txt

匚w某行单词

$sed -n '4,/The/'p quote.txt

匚w元字W?/p>

$sed -n '/\$/'p quote.txt

昄整个文g

$sed -n '1,$p' quote.txt    sed -n '1,$'p quote.txt

L字符

$sed -n '/.*ing/'p quote.txt  L字符出现一ơ或N?以ingl尾

首末?/p>

$sed -n '1p' quote.txt

$sed -n '$p' quote.txt

打印行号

$sed -n '/music/=' quote.txt

2

$sed -n -e '/music/p' -e '/music/=' quote.txt

It was an evening of splendid music and company.

2

附加文g

!/bin/sed -f

/文g中匹配的字符/ a\

插入的字W?+x; *.sed quote.txt

删除?/p>

$sed '1d' quote.txt 删除W一?/p>

$sed '1,3d' quote.txt 删除1??/p>

$sed '$d' quote.txt 删除最后一?/p>

$sed '/Neave/d' quote.txt 删除带Neave的行

替换文本

$sed 's/night/NIGHT/' quote.txt  s替换/night/NIGHT/

$sed 's/\$//' quote.txt  $换成I格

$sed 's/The/Wow!/g' quote.txt    g替换所?/p>

$sed 's/splendid/SPLENDID/w sed.out' quote.txt  w sed.out此行写入文g

$sed -n 's/nurse/"Hello" &/p' quote.txt  

The local "Hello" nurse Miss P.Neave was in attendance.

$sed -n 's/played/from Hockering &/p' quote.txt

sedl果写入文g命o

$sed '1,2 w filedt' quote.txt W一二行写入文g

$sed '/Neave/ w dht' quote.txt 匚w//的写入文?/p>

从文件中L?/p>

$sed '/company./r sedex.txt' quote.txt

在quote.txt的company后换?写入sedex.txt的内?/p>

匚w后退?/p>

$sed '/.a.*/q' quote.txt

L字符后跟a,再跟L字符0ơ或Lơ匹?

Line 1.band  Line 2.bad  Liner3.was  Line 4.was

The honeysuckle hand played all night long for only $90.

vi dos.txt

12332##DISO##45.12^M

00332##LPSO##23.11^M

01299##USPD##34.46^M

用一个空格替换所有的##,删除最前边?,删除N^M

$sed 's/##*/ /g' dos.txt

$sed 's/^0*/ /g' dos.txt

$sed 's/\^M//g' dos.txt

$cat dos.txt |sed 's/##*/ /g'|sed 's/^0*/ /'|sed 's/\^M//g'

处理报文输出

Database      Size(MB)   Date Created

-------------------------------------

GOSOUTH       2244       12/11/97

TRISUD        5632       8/9/99

(2 rows affected)

1>使用s/-*//g删除 -----------

2>使用/^$/d删除I

3>使用$d删除最后一?/p>

4>使用1d删除W一?/p>

5>使用awk {print $1}打印W一?/p>

cat sql.txt | sed 's/--*//g' | sed '/^$/d' | sed '$d' | sed '1d' | awk '{print $1}'

去除行首数字

$vi UNH.txt

12345UND SPLLFC 234344

9999999UND SKKLT 3423

1UND SPLLY 434

$sed 's/^[0-9]*//g' UND.txt

附加文本每一行末֊上字W串'passwd'

vi ok.txt

AC456

AC492169

AC9967

AC88345

$sed 's/[0-9]*/& Passwd/g' ok.txt

从sed输出中设|shell变量

$NAME="It's a go situation"

$REPLACE="GO"

$NEW_NAME='echo $NAME | sed "s/go/$REPLACE/g"'

$echo $NEW_NAME

快速一行命?/p>

's/\.$//g'       删除?l尾的行

'-e /abcd/d'     删除包含abcd的行

's/[][][]*/[]/g' 删除一个以上的I格,用一个空g?/p>

's/^[][]*//g'    删除行首I格

's/\.[][]*/[]//g 删除.后跟2或多个空?以一个空g?/p>

's/COL\(...\)//g'删除COL和它后边?个字母的?/p>

's/^\//g'        删除W一个\

's/[]/[]//g'     删除所有空格ƈ用tab替代

's/^[]//g'       删除行首tab?/p>

's/[]*//g'       删除所有tab?/p>

插入文本

$echo "Mr Willis"|sed 's/Mr/& Bruce/g'

删除首字W?/p>

$echo "attkla.dc"|sed 's/^./g'

删除文g扩展?/p>

$echo "attkla.dc"|sed 's/.dc//g'

增加扩展?/p>

$echo "attkla"|sed 's/$/.dc/g'

替换字符pd

$x="Department+payroll%Building G"

+ 换成of %换成located

$echo $x | sed 's/\+/ of /g' | sed 's/\%/ Located at /g '

      直接替换
      sed -i  's/from/to/' filename

转自Q?br />http://blog.chinaunix.net/u/28584/showart.php?id=1712332

chatler 2009-11-23 21:21 发表评论
]]>
AWK使用http://www.shnenglu.com/beautykingdom/archive/2009/11/23/101737.htmlchatlerchatlerMon, 23 Nov 2009 13:20:00 GMThttp://www.shnenglu.com/beautykingdom/archive/2009/11/23/101737.htmlhttp://www.shnenglu.com/beautykingdom/comments/101737.htmlhttp://www.shnenglu.com/beautykingdom/archive/2009/11/23/101737.html#Feedback0http://www.shnenglu.com/beautykingdom/comments/commentRss/101737.htmlhttp://www.shnenglu.com/beautykingdom/services/trackbacks/101737.html以前q在玩UNIX的时候就觉得里面有个命o很好用AWK,功能强大.q有SED和EDQ用q三个命令就可以解决qx工作中的问题?
前几天在单位做报扚w处理?要是用手工一个网点一个网Ҏ慢的改的?不通宵也得搞到3?炚w。对于我q种懒hQ那是很痛苦的事Q于是只得做些懒人喜Ƣ做的事了。花了二十分钟左叻Il于把SHELL的脚本写好,每次处理43个网点的报表Q用时不?5U?
脚本中所用命令ؓQ?
find
awk
׃长时间没有写SHELL里的脚本了,׃好些旉试Q这里重温下AWK的一些常用的用法Q?
awk 用法Qawk ' pattern {action} '
变量?nbsp;  含义
ARGC   命o行变元个?
ARGV   命o行变元数l?
FILENAME  当前输入文g?
FNR   当前文g中的记录?
FS   输入域分隔符Q默认ؓ一个空?
RS   输入记录分隔W?
NF   当前记录里域个数
NR   到目前ؓ止记录数
OFS   输出域分隔符
ORS   输出记录分隔W?
1、awk '/101/' file 昄文gfile中包?01的匹配行?
awk '/101/,/105/' file
awk '$1 == 5' file
awk '$1 == "CT"' file 注意必须带双引号
awk '$1 * $2 >100 ' file
awk '$2 >5 && $2<=15' file
2、awk '{print NR,NF,$1,$NF,}' file 昄文gfile的当前记录号、域数和每一行的W一个和最后一个域?
awk '/101/ {print $1,$2 + 10}' file 昄文gfile的匹配行的第一、二个域?0?
awk '/101/ {print $1$2}' file
awk '/101/ {print $1 $2}' file 昄文gfile的匹配行的第一、二个域Q但昄时域中间没有分隔W?
3、df | awk '$4>1000000 ' 通过道W获得输入,如:昄W?个域满条g的行?
4、awk -F "|" '{print $1}' file 按照新的分隔W?#8220;|”q行操作?
awk 'BEGIN { FS="[: \t|]" }
{print $1,$2,$3}' file 通过讄输入分隔W(FS="[: \t|]"Q修改输入分隔符?
Sep="|"
awk -F $Sep '{print $1}' file 按照环境变量Sep的值做为分隔符?
awk -F '[ :\t|]' '{print $1}' file 按照正则表达式的值做为分隔符Q这里代表空根{?、TAB、|同时做ؓ分隔W?
awk -F '[][]' '{print $1}' file 按照正则表达式的值做为分隔符Q这里代表[、]
5、awk -f awkfile file 通过文gawkfile的内容依ơ进行控制?
cat awkfile
/101/{print "\047 Hello! \047"} --遇到匚w行以后打?' Hello! '.\047代表单引受?
{print $1,$2} --因ؓ没有模式控制Q打印每一行的前两个域?
6、awk '$1 ~ /101/ {print $1}' file 昄文g中第一个域匚w101的行Q记录)?
7、awk 'BEGIN { OFS="%"}
{print $1,$2}' file 通过讄输出分隔W(OFS="%"Q修改输出格式?
8、awk 'BEGIN { max=100 ;print "max=" max} BEGIN 表示在处理Q意行之前q行的操作?
{max=($1 >max ?$1:max); print $1,"Now max is "max}' file 取得文gW一个域的最大倹{?
Q表辑ּ1?表达?:表达? 相当于:
if (表达?)
表达?
else
表达?
awk '{print ($1>4 ? "high "$1: "low "$1)}' file
9、awk '$1 * $2 >100 {print $1}' file 昄文g中第一个域匚w101的行Q记录)?
10、awk '{$1 == 'Chi' {$3 = 'China'; print}' file 扑ֈ匚w行后先将W?个域替换后再昄该行Q记录)?
awk '{$7 %= 3; print $7}' file 第7域被3除,q将余数赋给W?域再打印?
11、awk '/tom/ {wage=$2+$3; printf wage}' file 扑ֈ匚w行后为变量wage赋值ƈ打印该变量?
12、awk '/tom/ {count++;}
END {print "tom was found "count" times"}' file END表示在所有输入行处理完后q行处理?
13、awk 'gsub(/\$/,"");gsub(/,/,""); cost+=$4;
END {print "The total is $" cost>"filename"}' file gsub函数用空串替??再将l果输出到filename中?
1 2 3 $1,200.00
1 2 3 $2,300.00
1 2 3 $4,000.00
awk '{gsub(/\$/,"");gsub(/,/,"");
if ($4>1000&&$4<2000) c1+=$4;
else if ($4>2000&&$4<3000) c2+=$4;
else if ($4>3000&&$4<4000) c3+=$4;
else c4+=$4; }
END {printf "c1=[%d];c2=[%d];c3=[%d];c4=[%d]\n",c1,c2,c3,c4}"' file
通过if和else if完成条g语句
awk '{gsub(/\$/,"");gsub(/,/,"");
if ($4>3000&&$4<4000) exit;
else c4+=$4; }
END {printf "c1=[%d];c2=[%d];c3=[%d];c4=[%d]\n",c1,c2,c3,c4}"' file
通过exit在某条g旉出,但是仍执行END操作?
awk '{gsub(/\$/,"");gsub(/,/,"");
if ($4>3000) next;
else c4+=$4; }
END {printf "c4=[%d]\n",c4}"' file
通过next在某条g时蟩q该行,对下一行执行操作?

14、awk '{ print FILENAME,$0 }' file1 file2 file3>fileall 把file1、file2、file3的文件内容全部写到fileall中,格式?
打印文gq前|文件名?
15、awk ' $1!=previous { close(previous); previous=$1 }
{print substr($0,index($0," ") +1)>$1}' fileall 把合q后的文仉新分拆ؓ3个文件。ƈ与原文g一致?
16、awk 'BEGIN {"date"|getline d; print d}' 通过道把date的执行结果送给getlineQƈ赋给变量dQ然后打印?
17、awk 'BEGIN {system("echo "Input your name:\\c""); getline d;print "\nYour name is",d,"\b!\n"}'
通过getline命o交互输入nameQƈ昄出来?
awk 'BEGIN {FS=":"; while(getline< "/etc/passwd" >0) { if($1~"050[0-9]_") print $1}}'
打印/etc/passwd文g中用户名包含050x_的用户名?
18、awk '{ i=1;while(i<NF) {print NF,$i;i++}}' file 通过while语句实现循环?
awk '{ for(i=1;i<NF;i++) {print NF,$i}}' file 通过for语句实现循环?
type file|awk -F "/" '
{ for(i=1;i<NF;i++)
{ if(i==NF-1) { printf "%s",$i }
else { printf "%s/",$i } }}' 昄一个文件的全\径?
用for和if昄日期
awk 'BEGIN {
for(j=1;j<=12;j++)
{ flag=0;
printf "\n%d月䆾\n",j;
for(i=1;i<=31;i++)
{
if (j==2&&i>28) flag=1;
if ((j==4||j==6||j==9||j==11)&&i>30) flag=1;
if (flag==0) {printf "%02d%02d ",j,i}
}
}
}'
19、在awk中调用系l变量必ȝ单引P如果是双引号Q则表示字符?
Flag=abcd
awk '{print '$Flag'}' l果为abcd
awk '{print "$Flag"}' l果?Flag 转自Q?br>http://blog.chinaunix.net/u/28584/showart.php?id=1712347

chatler 2009-11-23 21:20 发表评论
]]>
find命o详解<?gt;http://www.shnenglu.com/beautykingdom/archive/2009/11/10/100665.htmlchatlerchatlerTue, 10 Nov 2009 14:32:00 GMThttp://www.shnenglu.com/beautykingdom/archive/2009/11/10/100665.htmlhttp://www.shnenglu.com/beautykingdom/comments/100665.htmlhttp://www.shnenglu.com/beautykingdom/archive/2009/11/10/100665.html#Feedback0http://www.shnenglu.com/beautykingdom/comments/commentRss/100665.htmlhttp://www.shnenglu.com/beautykingdom/services/trackbacks/100665.html
查找/etc/rc.d目录下面所有以crondl束的文Ӟq用file指o查看其属性,注意Qexec和file间是一个空|file和{}间是一个空|file和\;之间是一个空|\;是一个整体?br>
要在/usr/linux中查找所有的*.hQƈ在这些文件中查找“SYSCALL_VECTOR"Q最后打印出所有包?SYSCALL_VECTOR"的文件名Q有以下几种Ҏ实现
find /usr/linux -name "*.h" | xargs -n50 grep SYSCALL_VECTOR
grep SYSCALL_VECTOR /usr/linux/*.h | cut -d':' -f1 | uniq > filename
find /usr/linux -name "*.h" -exec grep "SYSCALL_VECTOR" {} \; -print

  我用find / -name filename| rm -rfQ不成功Q请问ؓ什么不成功Q?br>find / -name filename -exec rm -rf {} \;
find . -name filename |rm -rf试一下{} 表示你找出来的结果?br>\; 则相当于“宪法”Q没什么说_是q么规定的,?-exec 后面需要一个表C命ol结的的W号。可以在 man find 中找?**?br>要让rm识别find的结果,如下Q?br>find / -name filename |xargs rm -rf
之所以find . -name filename |rm -rf不通过Q是因ؓrm命o不接受从标准输入传过来的指o
  查找含特定字W串的文?br>例如查找当前目录下含?the string you want find..."字符串的文gQ?br>$find . -type f -exec grep “the string you want find...” {} ; -print

  从根目录开始查tmpfileQ一旦查到马上删?br>find / -name "tmpfile" -exec rm {} \;

  find 的perm问题
请问一下以下命令什么意思?关键是那个数字前?Q其他都q知?br>find -name ".*" -perm -007
我知?br>find -name ".*" -perm 755
q个是用来查找权限位?55的隐藏文?br>噢,对了q有Q我上边的命令都省略了find的pathname参数 find默认是查扑ֽ前工作目录的吗?
如果我用 -ok 替代 -exec, 那么q需要加?{} \; 吗?
q个已经清楚Q仍焉要,因ؓ -ok 只是 -exec 的提C模式,它只是多了一个确认操作的步骤,刚才没有L那几句E文的意?呵呵 不好意?br>-007是指查找所有用户都可读、写、执行的文gQ要心呀~~~
解释解释Q?br>find -name ".*" -perm -007 ?find -name ".*" -perm 777 有区别吗Q?br>-007是怎么来得呢?
不过有一个问?br>我用 find . -perm -100 会列出当前目?. , q是Z么呢Q?br>
下面引用由explover?2002/10/01 06:15am 发表的内容:
-007是指查找所有用户都可读、写、执行的文gQ要心呀~~~
-007是查扑֐其它用户(不同l?非属?可读,?执行的文?q不一定要同组可读?-是指最权限ؓ007.
下面引用׃颗小白菜?2002/10/01 10:16am 发表的内容:
OK了, 呵呵
不过有一个问?br>我用 find . -perm -100 会列出当前目?. , q是Z么呢Q?br>q种Ҏ不会准确的找出目录的. -100是指权限臛_是属dq行.
在unixpȝ?你可以拥有对目录文g的执行权你才可以q入一个目?q便是目录文件被列出的原?
find . -perm -001 -print扑ֈ往往是目录文?
我的意思当然不是用这U方法来扄录,只不q不明白其中?-100 意义?br>那以此类推,是不?-010是指权限臛_是owner同组可执行的吗?也就是说其实q里?10?是分开的,-表示一个至的意思,而且010才是真正用来描述权限位的Q?br>q样子就明白?谢谢你噢

  find出来的东西拷到另一个地?
find *.c -exec cp '{}' /tmp ';'
如果有特D文Ӟ可以用cpioQ也可以用这L语法Q?br>find dir -name filename -print | cpio -pdv newdir

  扑և盘中某个大范围内的文?br>比如要查扄盘中大于3M的文Ӟ
find . -size +3000k -exec ls -ld {} ;

  如何用find查找某一天更改的文gQ?br>可以使用q一行命令来实现Q?br>A=`find ~ -print` | ls -l --full-time $A 2>/dev/null | grep "Jun 27" | grep 1998

  使用find 命o查找某个旉D늚shell怎么写。比?1点到12点的。thanks
创徏一个脚本judgetimeQ内容如下:
ls -l $*|awk '{split($8,hour,":");if((hour[1]>23 || hour[1] < 1)&&hour[1]<24)print}'
到要查找的目录下Q运?br>find ./ -name "*" -exec judgetime {} \;
注意旉格式为2Q小时制?br>thank you Q如果我要精到分钟?br>touch -t 04241112 starttemp #_?2分钟
touch -t 04241220 endtemp #截止?2?0
find [dir] -newer starttemp -a ! -newer endtemp -exec ls -l {} \;
newer?
那昨天1Q:Q0文g如何呢?
每天执行的时候,用当天的日期和时间戳替换一下不p了吗Q?br>我不知道他是不是把所有的11Q?0~12Q?0的都扑և来,是不是只执行一ơ还是每天都执行Q?br>q种情况俺猜x自己的东西放在哪忘了Q只记得当时是深夜了?br>有道理!
不愧是斑竹!
不光知道怎么解决问题Q还知道在什么情况下出现q类问题Q佩服佩服!
问题又出C。创个文件的时候。本来应该是旉的一栏现在写上了2002Q而不?2Q?0.
{到12Q?0q了吧!

  删除指定日期的文?br>find ./ -name 文g?-exec rm -f {} \;
例:删除当前30天内没用q的文g,用如下命令:
find / -atime +30 -exec rm -f {} \;
我自p着写了一段SHELL,也用ll ,grep, rm 几个命oQ用hq差Zh意?br>对过滤出来的文g名列表中用了一个FOR语句Q再执行rm 。现在我xq段SHELL 扩展一下让它每天定时运行将 n 天前的文件删掉,有没有h能给我一些提C,谢谢Q?br>q有个问题,对于前面那位朋友提到?find / -atime +30 -exec rm -f {} \;
"ҎQ我很早pq几ơ,不过好像都不太对Q参?-atime n 是查找n天前被访问过的文Ӟ我不明白的是q里的时间参照点是什么,以及q个n天是怎么计算的?br>问题二、对?ll |cut -f 1" q个命o我是不是用错了,我只惛_?ll 中列出的文g名,但用cut -f 命o做不?Q我只好换用 ll |cut -c 59- q种方式得到我要的文件名Qbut it's a pool idear Q我也试q用awk Q好像也不对Q看看大家可不可以给我一些小的提醒QTKS SO MUCH
问题三、如何改?Il点 的日期格?我现在的pȝ昄的格式是Q?br>-rw-r----- 1 msahz01 users 2253 2002q??2?poheader.i
我想把这换成
-rw-rw-rw- 1 house users 2193 Apr 19 2001 hkdisp.p
如何才能做到q点Q?br>awk 应该可以
ll | awk '{print $9}'
  删除多少天之前的文g
find /yourpath -mtime +31 -exec rm {} \;
find /yourpath -mtime +366 -exec rm {} \;

find? -ctime, -mtime及其-atime有何区别

请问 -ctime ?-mtime 有什么关p??
如果父目录的 ctime 改变, 那它下面的文件的 ctime ׃自动都改了吗 ?
-ctime ?-mtime ,-atime q些信息是存在哪儿呢 ?

我用 -mtime -1 扑ֈ了新建或改的文g.
但怎样才能扑ֈ一天内 mv 来的文g? 它们的时间是原有的时?早于一?) ?

?newer选项啊?br>你可以先touch一个你惌的时间的文g如下Q?br>$ touch -t 08190800 test
$ ls -l test
-rw-r--r-- 1 dba other 0 Aug 19 08:00 test
然后
$ find . -newer test -print
.
./.sh_history
$ ls -l .sh_history
-rw------- 1 dba other 154 Aug 20 17:39 .sh_history

用touch可以写出你想要的M旉的文Ӟ然后?newer ,! -newer选项卛_成功?br>
1.ctime含inode信息修改的时?mtime只指文g内容建立或修改的旉.
2 不会.
3.q些信息应该是存在文件系l的块里.

我查了书 -ctime 是指 inode 的改?或称文g的状态改?.
请问 inode 存了哪些信息 ?
做了些小试,-mtime ? -ctime 一定也?
Ҏ件名, -ctime 也会?
谁能回答 i-node 存了哪些东西 ?

vi /usr/include/sys/inode.h

班主,我不?access /usr/include/sys/inode.h .
摘书如下:
Directories contain directory entries. Each entry contains a file or subdirectory name and an index node reference number (i-node number). To increase speed and enhance use of disk space, the data in a file is stored at various locations in the computer's memory. The i-node contains the addresses used to locate all the scattered blocks of data associated with a file. The i-node also records other information about the file including time of modification and access, access modes, number of links, file owner, and file type.
可我发现 -atime 改了, -ctime q没? why ?
( 我先 cat 一?ASCII 文g,再用 -atime -1 有它?-ctime -1 居然没有?)
着岂不?inode 信息改变, ctime 改矛盾?

我不同意你脓出来的那D|?正如我提到的那样,atime,ctime,mtime是放到超U块?在sco unix下是一U叫stat的结?(stat_32),不同的系l文件系l可能不?
sco 下inode的结构如?

typedef struct inode
{
struct inode *i_forw; /* inode hash chain */
struct inode *i_back; /* '' */
struct inode *av_forw; /* freelist chain */
struct inode *av_back; /* '' */
int *i_fsptr; /* "typeless" pointer to fs dependent */
ino32_t i_number; /* i number, 1-to-1 with dev address */
ushort i_ftype; /* file type = IFDIR, IFREG, etc. */
short i_fstyp; /* File system type */
off_t i_size; /* size of file */
ushort i_uid; /* owner */
ushort i_gid; /* group of owner */
ushort i_flag;
ushort i_want; /* i_flag extension to avoid MP races */
ushort i_count; /* reference count */
short i_nlink; /* directory entries */
dev_t i_rdev; /* Raw device number */
#define i_namtype i_rdev /* i_ftype==IFNAM subtype */
dev_t i_dev; /* device where inode resides */
struct mount *i_mton;/* ptr to mount table entry that */
/* this directory is mounted on */
struct region *i_rp; /* ptr to shared region if any */
struct stdata *i_sp; /* ptr to associated stream */
struct iisem *isem; /* ptr to XENIX semaphores */
struct iisd *isd; /* ptr to XENIX shared data */
} i_un;
#define i_mnton i_un.i_mton /* i_ftype==IFDIR IMOUNT */
#define i_rptr i_un.i_rp /* i_ftype==IFREG || i_ftype==IFBLK */
#define i_sptr i_un.i_sp /* i_ftype==IFCHR || i_ftype==IFIFO */
#define i_sem i_un.isem /* i_ftype==IFNAM && i_namtype==IFSEM */
#define i_sd i_un.isd /* i_ftype==IFNAM && i_namtype==IFSHD */

struct fstypsw *i_fstypp; /* ptr to file system switch FSPTR */
long *i_filocks; /* pointer to filock (structure) list */
unsigned long i_mappages; /* number of pages currently cached */
unsigned long i_vcode; /* read-ahead block save (NFS) */
short i_wcnt; /* write open count or ITEXT count */
struct lockb i_cilock; /* tas to synchronize i_flag changes */
ushort i_rdlocks; /* count of non-exclusive lockers */
} inode_t;


所?讉K一个文件不能改变inode信息.
使用chown, chgrp, chmod命o可以很好的比较mtime和ctime
chown改变一个文件的属主,用ctime可以扑ֈ,用mtime便找不到.
试试?

多谢斑竹! 我是?Solaris 上面试的.我是?-ctime 不明?
试的l果如下:
修改文g,-mtime 改了, -ctime 也会?
讉K文g,-atime 改了, -ctime 没变.
chown, chgrp, chmod,mv, 都会?-ctime 改变,但不影响 -atime ?-mtime.
touch 可以?-mtime and/or -atime,?touch -a 只改讉K旉?-ctime也改?
touch -m 改修Ҏ间时,-ctime当然也改?
好象q有别的很多东西可以?-ctime 改变, 搞不清楚.
有什么方法可以显C?-mtime,atime,ctime ?
可以?-ctime 来实现对目录的增量文件进行备份或 transfer ??
多谢!

没有什么工hC?(可能是俺不知?
把下面程序里的st_mtime换成st_ctime,或st_atime便可以得C要的?
Qi nclude
int
main (int argc, char **argv)
{
struct stat buf;
char date[80];
char fname[80];
printf("Enter filename (with full path) to check mtime : ");
scanf("%s",fname);
stat(fname, &buf);
printf ("mtime (in sec) of %s = %ld\n", fname, buf.st_mtime);
strcpy(date, ctime((time_t *)&(buf.st_mtime)));
printf ("mtime (in date) of %s = %s\n", fname, date);
}

至于文g备䆾,有什么不可以的么?

mtime ls -l 最q修Ҏ件内容的旉
atime ls -lu 最q访问文件的旉
ctime ls -li 最q文件有所改变的状?,如文件修?属性\属主 改变 ,节点 ,链接变化{?,应该是不拘惔只是旉前后的改?br>
俺看了ls的帮?以ؓ只是按ctime或atime排序,昄的时间还是mtime.

仔细比较了一?ayhan说的是对?谢谢ayhan.

多谢 ahyan 提示 ! 我在 Solaris 上试q如?
mtime ?ls -l 看到
atime ?ls -lu 看到
ctime ?ls -lc 看到. (ls -li 只有 inode number)
摘书如下:
-c Uses time of last modification of the i-node (file
created, mode changed, and so forth) for sorting (-t)
or printing (-l or -n).
-u Uses time of last access instead of last modification
for sorting (with the -t option) or printing (with the
-l option).
-i For each file, prints the i-node number in the first
column of the report.

我在sco unix5.0.5中试了一下,好像不对Qchmod,chgrp{不会改变ls -il昄的时_vi,touch倒是有媄响?br>每一U操作系l都是由成千上万个不同种cȝ文g所l成的。其中有pȝ本n自带的文Ӟ用户自己的文Ӟq有׃n文g{等。我们有时候经常忘记某份文件放在硬盘中的哪个地斏V在微Y的WINDOWS操作pȝ中要查找一份文件是相当单的事情Q?只要在桌面上点击“开?#8221;Q?#8220;搜烦”中就能按照各U方式在本地盘上,局域网l,甚至在INTERNET上查扑֐U文Ӟ文?br>  可是使用linux的用户就没有那么q运了,在Linux上查找某个文件确实是一件比较麻烦的事情。毕竟在linux中需要我们用专用的“查找”命o来寻扑֜盘上的文g。Linux 下的文g表达格式非常复杂Q不象WINDOWS,DOS下都是统一的AAAAAAA.BBB格式那么方便查找Q在WINDOWS中,只要知道要查扄文g的文件名或者后~非常容易查扑ֈ。linux中查找文件的命o通常?#8220;find”命oQ?#8220;find”命o能帮助我们在使用,理linux的日怺务中方便的查扑և我们需要的文g。对于linux新手来说Q?#8220;find”命o也是了解和学习Linux 文g特点的方法。因为linux发行版本J多Q版本升U很快,在Linux书籍上往往写明某个配置文g的所在位|,往往linux新手按图索骥q是不能扑ֈ。比如说REDHAT Linux 7.O 和REDHAT linux 7.1中有些重要的配置文g所在的盘位置和文件目录就有了很大的改变,如果不学会?#8220;find”命oQ那么在成千上万的linux文g中要扑ֈ其中的一个配|文件是相当困难的,W者在没有_N?#8220;find”命o之前吃q这L苦头。好Q下面就详细为大家介l强大的“find”命o的全部用方法和用途?br>
通过文g名查找法Q?br>  q个Ҏ说v来就和在WINDOWS下查找文件一样容易理解了?如果你把q个文g攑֜单个的文件夹里面Q只要用常见的“ls"命op方便的查扑և来,那么使用“find”命o来查扑֮׃能给你留下深ȝ印象Q毕?#8220;find”命o的强大功能不止这个。如果知道了某个文g的文件名Q而不知道q个文g攑ֈ哪个文g夹,甚至是层层套嵌的文g多w。D例说明,假设你忘Chttpd.confq个文g在系l的哪个目录下,甚至在系l的某个地方也不知道Q则q是可以使用如下命oQ?br>  find / -name httpd.conf
  q个命o语法看v来很Ҏ明白了Q就是直接在find后面写上 -nameQ表明要求系l按照文件名查找Q最后写上httpd.confq个目标文g名即可。稍{一会系l会在计机屏幕上显C出查找l果列表Q?br>  etc/httpd/conf/httpd.conf
  q就是httpd.confq个文g在linuxpȝ中的完整路径。查找成功?br>  如果输入以上查找命o后系lƈ没有昄出结果,那么不要以ؓpȝ没有执行 find/ -name httpd.conf命oQ而可能是你的pȝ中没有安装Apache服务器,q时只要你安装了Apache Web服务器,然后再用find / -name httpd.confp扑ֈq个配置文g了?br>
无错误查找技巧:
  在linuxpȝ?#8220;find”命o是大多数pȝ用户都可以用的命oQ?q不是ROOTpȝ理员的专利。但是普通用户?#8220;find”命o时也有可能遇到这L问题Q那是L inuxpȝ中系l管理员ROOT可以把某些文件目录设|成止讉K模式。这h通用户就没有权限?#8220;find”命o来查询这些目录或者文件。当普通用户?#8220;find”命o来查询这些文件目录是Q往往会出?Permissiondenied."Q禁止访问)字样?pȝ无法查询到你想要的文g。ؓ了避免这L错误Q我们可是用{U错误提C的Ҏ试着查找文gQ输?br>  find / -name access_log 2>/dev/null
  q个Ҏ是把查找错误提示转移到特定的目录中去。系l执行这个命令后Q遇到错误的信息q接输送到stderrstream 2 中,access_log 2 是表明pȝ把错误信息输送到stderrstream 2中,/dev/null是一个特D的文gQ表明空的或者错误的信息Q这h询到的错误信息将被{UMQ不会再昄了?br>
  在linuxpȝ查找文g也会遇到q样一个实际问题。如果我们在整个盘Q?q个pȝ中查找某个文件就要花费相当长的一D|_特别是大型linuxpȝ和容量较大的盘Q文件放在套嵌很q目录中的时候。如果我们知道了q个文g存放在某个大的目录中Q那么只要在q个目录中往下找p节省很多旉了。用find /etc -name httpd.conf 可以解册个问题。上面的命o是表示在etc目录中查询httpd.confq个文g?q里再说明一?#8220;/ ”q个函数W号的含义,如果输入 “find/ ”是表示要求linuxpȝ在整?ROOT目录下查找文Ӟ也就是在整个盘上查找文Ӟ?#8220;find/etc”是只在 etc目录下查找文件。因?#8220;find/etc”表示只在etc目录下查找文Ӟ 所以查扄速度q应要快很多了?br>
Ҏ部分文g名查找方法:
  q个Ҏ和在WINDOWS中查扑ַ知的文g名方法是一L。不q在linux中根据部分文件名查找文g的方法要比在WINDOWS中的同类查找Ҏ要强大得多?例如我们知道某个文g包含有srmq?个字母,那么要找到系l中所有包含有q?个字母的文g是可以实现的Q输入:
  find /etc -name '*srm*'
  q个命o表明了linuxpȝ在/etc 整个目录中查找所有的包含有srmq?个字母的文gQ比?absrmyzQtibc.srm{等W合条g的文仉能显C出来。如果你q知道这个文件是?srm q?个字母打头的Q那么我们还可以省略最前面的星P命o如下Q?br>  find/etc -name 'srm*'
  q是只有像srmyz q样的文件才被查扑և来,象absrmyz或者absrmq样的文仉不符合要求,不被昄Q这h找文件的效率和可靠性就大大增强了?br>
Ҏ文g的特征查询方法:
  如果只知道某个文件的大小Q修Ҏ期等特征也可以?find"命o查找出来Q这?WINDOWSpȝ中的"搜烦"功能是基本相同的。在微Y?搜烦"中WINDOWS中的"搜烦助理"使得搜烦文g和文件夹、打印机、用户以及网l中的其他计机更加Ҏ。它甚至使在 Internet 上搜索更加容易?搜烦助理"q包括一个烦引服务, 该服务维护了计算Z所有文件的索引Q得搜索速度更快。?搜烦助理"Ӟ用户可以指定多个搜烦标准。例如,用户可以按名U、类型及大小搜烦文g和文件夹。用L臛_以搜索包含特定文本的文g。如果用h使用 Active DirectoryQ这时还可以搜烦带有特定名称或位|的打印机?br>  例如我们知道一个linux文g大小?,500 bytesQ那么我们可是用如下命令来查询 find / -size 1500cQ字W?c 表明q个要查扄文g的大是以bytes为单位。如果我们连q个文g的具体大都不知道,那么在linux中还可以q行模糊查找方式来解冟?例如我们输入find/ -size +10000000c q个命oQ?则标明我们指定系l在根目录中查找出大?0000000字节的文件ƈ昄出来。命令中?#8220;Q?#8221;是表C求系l只列出大于指定大小的文Ӟ而?#8220;-”则表C求系l列出小于指定大的文g。下面的列表是在linux使用不同"find"命o后系l所要作出的查找动作Q?从中我们很容易看出在linux中?find" 命o的方式是很多的,"find"命o查找文g只要灉|应用Q?丝毫不必在WINDOWS中查找能力差?br>  find / -amin -10 # 查找在系l中最?0分钟讉K的文?br>  find / -atime -2 # 查找在系l中最?8时讉K的文?br>  find / -empty # 查找在系l中为空的文件或者文件夹
  find / -group cat # 查找在系l中属于 groupcat的文?br>  find / -mmin -5 # 查找在系l中最?分钟里修改过的文?br>  find / -mtime -1 #查找在系l中最?4时里修改过的文?br>  find / -nouser #查找在系l中属于作废用户的文?br>  find / -user fred #查找在系l中属于FREDq个用户的文?br>  下面的列表就是对find命o所可以指定文g的特征进行查扄部分条g。在q里q没有列举所有的查找条gQ参考有关linux有关书籍可以知道所有find命o的查扑և数?br>-amin n
查找pȝ中最后N分钟讉K的文?br>-atime n
查找pȝ中最后n*24时讉K的文?br>-cmin n
查找pȝ中最后N分钟被改变状态的文g
-ctime n
查找pȝ中最后n*24时被改变状态的文g
-empty
查找pȝ中空白的文gQ或I白的文件目录,或目录中没有子目录的文g?br>-false
查找pȝ中L错误的文?br>-fstype type
查找pȝ中存在于指定文gpȝ的文Ӟ例如Qext2
-gid n
查找pȝ中文件数字组 ID ?n的文?br>-group gname
查找pȝ中文件属于gnam文gl,q且指定l和ID的文?br>

Find命o的控刉项说明Q?br>Find命o也提供给用户一些特有的选项来控制查找操作。下表就是我们ȝ出的最基本Q最常用的find命o的控刉项及其用法?br>选项
用途描q?br>-daystart
.试pȝ从今天开?4时以内的文Ӟ用法cM-amin
-depth
使用深度U别的查找过E方?在某层指定目录中优先查找文g内容
-follow
遵@通配W链接方式查? 另外Q也可忽略通配W链接方式查?br>-help
昄命o摘要
-maxdepth levels
在某个层ơ的目录中按照递减Ҏ查找
-mount
不在文gpȝ目录中查找, 用法cM -xdev.
-noleaf
止在非UNUX文gpȝQMS-DOSpȝQCD-ROM文gpȝ中进行最优化查找
-version
打印版本数字

使用-follow选项后,find命o则遵循通配W链接方式进行查找,除非你指定这个选项Q否则一般情况下find命o忽略通配W链接方式进行文件查找?br>
-maxdepth选项的作用就是限制find命o在目录中按照递减方式查找文g的时候搜索文件超q某个别或者搜索过多的目录Q这样导致查N度变慢Q查找花费的旉q多。例如,我们要在当前(.)目录技巧子目录中查找一个名叫fred的文Ӟ我们可以使用如下命o
find . -maxdepth 2 -name fred

假如q个fred文g?/sub1/fred目录中,那么q个命o׃直接定位q个文gQ查扑־Ҏ成功。假如,q个文g? /sub1/sub2/fred目录中,那么q个命o无法查扑ֈ。因为前面已l给find命o在目录中最大的查询目录U别?Q只能查?层目录下的文件。这样做的目的就是ؓ了让find命o更加_的定位文Ӟ如果你已l知道了某个文g大概所在的文g目录U数Q那么加?maxdepth n 很快的能在指定目录中查找成功?br>
使用混合查找方式查找文g
find命o可以使用混合查找的方法,例如我们惛_/tmp目录中查扑֤?00000000字节q且?8时内修改的某个文gQ我们可以?and 来把两个查找选项链接hl合成一个؜合的查找方式?br>find /tmp -size +10000000c -and -mtime +2

学习q计机语言的朋友都知道Q在计算a里,使用and ,or 分别表示“?#8221;?#8220;?#8221;的关pR在linuxpȝ的查扑֑令中一样通用?br>q有q样的例子,
find / -user fred -or -user george

我们可以解释为在/tmp目录中查扑ֱ于fred或者georgeq两个用L文g?br>在find命o中还可以使用“?#8221;的关pL查找文gQ如果我们要?tmp目录中查找所有不属于panda的文Ӟ使用一个简单的
find /tmp ! -user panda
命o可以解决了。很单?br>
查找q显C文件的Ҏ
查找到某个文件是我们的目的,我们更想知道查找到的文g的详l信息和属性,如果我们采取现查找文Ӟ在用LS命o来查看文件信息是相当J琐的,现在我们也可以把q两个命令结合v来用?br>find / -name "httpd.conf" -ls

pȝ查找到httpd.conf文g后立卛_屏幕上显Chttpd.conf文g信息?br>12063 34 -rw-r--r-- 1 root root 33545 Dec 30 15:36 /etc/httpd/conf/httpd.conf

下面的表格就是一些常用的查找文gq显C文件信息的参数和用方?br>选项
用途描q?br>-exec command;
查找q执行命?br>-fprint file
打印文g完整文g?br>-fprint0 file
打印文g完整文g名包括空的文?br>-fprintf file format
打印文g格式
-ok command;
l用户命令执行操作,Ҏ用户的Y 认输入执行
-printf format
打印文g格式
-ls
打印同种文g格式的文?br>
ȝQ到q里为止我们已经学习了这名多关于find命o的用方法,也列Z很多常用的find命o的选项Q如果我们能熟练掌握在linux中find命o的用方法,那么在Linux中查找文件也不是一件困隄事情?br>
转自Q?br>http://www.lupaworld.com/94908/viewspace-109380.html

chatler 2009-11-10 22:32 发表评论
]]>
linux shell 片D?/title><link>http://www.shnenglu.com/beautykingdom/archive/2009/11/08/100395.html</link><dc:creator>chatler</dc:creator><author>chatler</author><pubDate>Sun, 08 Nov 2009 03:19:00 GMT</pubDate><guid>http://www.shnenglu.com/beautykingdom/archive/2009/11/08/100395.html</guid><wfw:comment>http://www.shnenglu.com/beautykingdom/comments/100395.html</wfw:comment><comments>http://www.shnenglu.com/beautykingdom/archive/2009/11/08/100395.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/beautykingdom/comments/commentRss/100395.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/beautykingdom/services/trackbacks/100395.html</trackback:ping><description><![CDATA[1.<span style="color: #000000; font-size: 16px;">关于文gҎ的Scripts<br>diff -b -r $Dir1 $Dir2 | grep -v "Common subdirectories" | grep -e "^diff" -e "^Binary files" -e "^Only"<br>diff:<br> -b  --ignore-space-change <br>              Ignore changes in the amount of white space.<br> -r  --recursive<br>              Recursively compare any subdirectories found.<br>grep:<br> -v, --invert-match<br>              Invert the sense of matching, to select non-matching lines.<br> -e PATTERN, --regexp=PATTERN<br>              Use PATTERN as the pattern; useful to protect patterns beginning with -.<br><br>2. grep的正则表辑ּQ?br>比如,要匹配两个单?  word  exec<br>grep -E "word|execl"  是可以得到正结果的<br>AND:<br>grep -E "word&execl"  和预期的不一?br>grep -E 'excel.*word|work.*excel'是可以的?br>注:正则表达式跟逻辑操作W是俩概?Q?只有awk支持||Q?amp;&q样的操作, <br>用grep的话Q?也只支持|而不支持&?br>正则基础Q?<br>$cat rfile<br>abcd<br>abc<br>ab<br><a href="mailto:beauty@linux-gznp:~/code/shell/test">$</a>grep -E 'abc.*' rfile<br>abcd<br>abc<br><a href="mailto:beauty@linux-gznp:~/code/shell/test">$</a>grep -E 'abc*' rfile<br>abcd<br>abc<br>ab<br><br>3. <span style="color: #000000; font-size: 16px;">如何获得一个文件的前N列或是其中的几列Q?/span><br>cut -f-2 -d ' ' filename<br>-f field   -d dilimeter<br><br>4.删除某个目录下不是以.sh .h .cl尾的文?br></span>find . -type f | awk '!/\.sh$/ && !/\.[c|h]$/{print $1}' | xargs rm <br><span style="color: #000000; font-size: 16px;"><br>5.原来用冒号分隔的Q选出几列来,Ҏ用竖杠分隔的<br>cat /etc/passwd | awk -F: '{print $1"|"$2"|"$3"|"$4}'<br><br>6.L文g中的字符Q比如去掉从win上传到Linux上的文g时会有个^M,若去掉他可以用:<br></span>tr -d '\015'  < filename<br><span style="color: #000000; font-size: 16px;"><br>7.目录树是<br>A/B/C/<br>A/B/C/ccc/...<br>A/B/C/bbb/...<br>A/B/C/D/aaa/...<br>我现在在A下,我要查找html后缀文gQ?但是不想它在包含aaa||bbb||ccc的目录下查找.<br>find . \( -name Input -o -name Output -o -name Current \) -type d -prune -o -name "*.htm" -print<br>q个命o中的目录排除没有起作用,Z么嗯Q很困惑?br>find . -wholename './A/B' -prune -o -print<br>q个命o也不起作用,更困惑了Q不认wholename<br><br></span>8. 循环L件的命o <br>for x in `seq 1 12`; do cat $x|awk '{print $9}' && sleep 3;done <br> <div>seq 是Linux 中一個預a的外部命o,一般用作一堆數字的化寫法Q如<br>seq 1 10<br>便會出現 <br>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10 <br>它還有三個選?br>  -f, --format=FORMAT      use printf style floating-point FORMAT (default: %g)<br>  -s, --separator=STRING   use STRING to separate numbers (default: \n)<br>  -w, --equal-width        equalize width by padding with leading zeroes</div> <div>-f 最常用 , 例如一ơ制?10 個名 dir001 , dir002 .. dir010 的目錄,它便很有用?我們可以這樣</div> <div>下一個命令便可了<br>seq -f 'dir%03g' 1 10 | xargs mkdir<br>?br>mkdir $(seq -f 'dir%03g' 1 10)<br>它用的是 printf 的格?, %03g' 代表以三位Q點數,以此ҎQ?/div> <div>如用bash3 ?printf也可作為{價命o<br>printf 'dir%03d\n' {1..10} | xargs mkdir  ?mkdir `printf 'dir%03d ' {1..10}`</div> <div>awk 當然也可?br>awk 'BEGIN { while (num < 10 ) printf "dir%03d\n", ++num ; exit}' | xargs mkdir</div> <div>這樣會比寫一個腳本快, 不必寫成<br>for dir in 001 002 003 004 005 006 007 008 009 010<br>do<br>    mkdir dir${dir}<br>done<br><br>9.扑և当前目录下大?00M的目?br>find . -maxdepth 1 -type d | xargs du -sh | grep -v '\.$'| grep -P '^\S+M\t' | awk -FM '$1>1'<br></div> <br> <img src ="http://www.shnenglu.com/beautykingdom/aggbug/100395.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/beautykingdom/" target="_blank">chatler</a> 2009-11-08 11:19 <a href="http://www.shnenglu.com/beautykingdom/archive/2009/11/08/100395.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux ?scp 的用?lt;?gt;http://www.shnenglu.com/beautykingdom/archive/2009/11/02/99965.htmlchatlerchatlerMon, 02 Nov 2009 02:25:00 GMThttp://www.shnenglu.com/beautykingdom/archive/2009/11/02/99965.htmlhttp://www.shnenglu.com/beautykingdom/comments/99965.htmlhttp://www.shnenglu.com/beautykingdom/archive/2009/11/02/99965.html#Feedback0http://www.shnenglu.com/beautykingdom/comments/commentRss/99965.htmlhttp://www.shnenglu.com/beautykingdom/services/trackbacks/99965.html

chatler 2009-11-02 10:25 发表评论
]]>
BASH 中的字符串处?/title><link>http://www.shnenglu.com/beautykingdom/archive/2009/10/05/97893.html</link><dc:creator>chatler</dc:creator><author>chatler</author><pubDate>Mon, 05 Oct 2009 10:07:00 GMT</pubDate><guid>http://www.shnenglu.com/beautykingdom/archive/2009/10/05/97893.html</guid><wfw:comment>http://www.shnenglu.com/beautykingdom/comments/97893.html</wfw:comment><comments>http://www.shnenglu.com/beautykingdom/archive/2009/10/05/97893.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/beautykingdom/comments/commentRss/97893.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/beautykingdom/services/trackbacks/97893.html</trackback:ping><description><![CDATA[得到长度<br><br> <div id="08eokyg" class=msgbody> <div id="oqsm880" class=msgheader> <div id="ksmqcqo" class=right><a class=smalltxt onclick="copycode($('code0'));" ><u><font color=#0000ff>[Copy to clipboard]</font></u></a> <a class=smalltxt onclick="toggle_collapse('code0');" ><u><font color=#0000ff>[ <span id=code0_symbol>-</span> ]</font></u></a></div> CODE:</div> <div class="km00si0" id=code0 class=msgborder   style="font-family:Fixdays">%x="abcd"<br>#Ҏ一<br>%expr length $x<br>4<br># Ҏ?br>%echo ${#x}<br>4<br># Ҏ?br>%expr "$x" : ".*"<br>4<br># expr 的帮?br># STRING : REGEXP   anchored pattern match of REGEXP in STRING</div> </div> <br>查找子串<br><br> <div id="0akiw0o" class=msgbody> <div id="ke0cems" class=msgheader> <div id="s000c0o" class=right><a class=smalltxt onclick="copycode($('code1'));" ><u><font color=#0000ff>[Copy to clipboard]</font></u></a> <a class=smalltxt onclick="toggle_collapse('code1');" ><u><font color=#0000ff>[ <span id=code1_symbol>-</span> ]</font></u></a></div> CODE:</div> <div class="yys800w" id=code1 class=msgborder   style="font-family:Fixdays">%expr index  $x "b"<br>2<br>%expr index  $x "a"<br>1<br>%expr index  $x "b"<br>2<br>%expr index  $x "c"<br>3<br>%expr index  $x "d"<br>4</div> </div> <br>得到子字W串<br><br> <div id="0mgic0u" class=msgbody> <div id="qyc8ig8" class=msgheader> <div id="k006mcu" class=right><a class=smalltxt onclick="copycode($('code2'));" ><u><font color=#0000ff>[Copy to clipboard]</font></u></a> <a class=smalltxt onclick="toggle_collapse('code2');" ><u><font color=#0000ff>[ <span id=code2_symbol>-</span> ]</font></u></a></div> CODE:</div> <div class="kmgsuay" id=code2 class=msgborder   style="font-family:Fixdays"># Ҏ一<br># expr <string> startpos length<br>%expr substr "$x" 1 3<br>abc<br>%expr substr "$x" 1 5<br>abcd<br>%expr substr "$x" 2 5<br>bcd<br># Ҏ?br># ${x:pos:lenght}<br>%echo ${x:1}<br>bcd<br>%echo ${x:2}<br>cd<br>%echo ${x:0}<br>abcd<br>%echo ${x:0:2}<br>ab<br>%pos=1<br>%len=2<br>%echo ${x:$pos:$len}<br>bc</div> </div> <br>匚w正则表达?br><br> <div id="880qsag" class=msgbody> <div id="00wqskg" class=msgheader> <div id="km880gu" class=right><a class=smalltxt onclick="copycode($('code3'));" ><u><font color=#0000ff>[Copy to clipboard]</font></u></a> <a class=smalltxt onclick="toggle_collapse('code3');" ><u><font color=#0000ff>[ <span id=code3_symbol>-</span> ]</font></u></a></div> CODE:</div> <div class="s0ku8m6" id=code3 class=msgborder   style="font-family:Fixdays"># 打印匚w长度<br>%expr match $x "."<br>1<br>%expr match $x "abc"<br>3<br>%expr match $x "bc"<br>0</div> </div> <br>字符串的掐头d<br><br> <div id="08gk0yo" class=msgbody> <div id="gyakuki" class=msgheader> <div id="00cwyg0" class=right><a class=smalltxt onclick="copycode($('code4'));" ><u><font color=#0000ff>[Copy to clipboard]</font></u></a> <a class=smalltxt onclick="toggle_collapse('code4');" ><u><font color=#0000ff>[ <span id=code4_symbol>-</span> ]</font></u></a></div> CODE:</div> <div class="86se00u" id=code4 class=msgborder   style="font-family:Fixdays">%x=aabbaarealwwvvww<br>%echo "${x%w*w}"<br>aabbaarealwwvv<br>%echo "${x%%w*w}"<br>aabbaareal<br>%echo "${x##a*a}"<br>lwwvvww<br>%echo "${x#a*a}"<br>bbaarealwwvvww</div> </div> <br>其中 , # 表示掐头Q?因ؓ键盘?# ?$ 的左面?br>其中 , % 表示%Q?nbsp; 因ؓ键盘?% ?$ 的右面?br>单个的表C最匹配,双个表示最大匹配?br>也就是说Q当匚w的有多种Ҏ的时候,选择匚w的最大长度还是最长度?br><br>字符串的替换<br><br> <div id="0800wck" class=msgbody> <div id="u00sw06" class=msgheader> <div id="y0gae0y" class=right><a class=smalltxt onclick="copycode($('code5'));" ><u><font color=#0000ff>[Copy to clipboard]</font></u></a> <a class=smalltxt onclick="toggle_collapse('code5');" ><u><font color=#0000ff>[ <span id=code5_symbol>-</span> ]</font></u></a></div> CODE:</div> <div class="0cqs80m" id=code5 class=msgborder   style="font-family:Fixdays">%x=abcdabcd<br>%echo ${x/a/b} # 只替换一?br>bbcdabcd<br>%echo ${x//a/b} # 替换所?br>bbcdbbcd</div> </div> <br>不可以?regexp Q?只能?* ? 的文件扩展方式?br><br>转自Q?br><a >http://bbs.chinaunix.net/viewthread.php?tid=201843</a><br> <img src ="http://www.shnenglu.com/beautykingdom/aggbug/97893.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/beautykingdom/" target="_blank">chatler</a> 2009-10-05 18:07 <a href="http://www.shnenglu.com/beautykingdom/archive/2009/10/05/97893.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>shell解释器问?-命o不听?http://www.shnenglu.com/beautykingdom/archive/2009/10/05/97877.htmlchatlerchatlerMon, 05 Oct 2009 03:05:00 GMThttp://www.shnenglu.com/beautykingdom/archive/2009/10/05/97877.htmlhttp://www.shnenglu.com/beautykingdom/comments/97877.htmlhttp://www.shnenglu.com/beautykingdom/archive/2009/10/05/97877.html#Feedback0http://www.shnenglu.com/beautykingdom/comments/commentRss/97877.htmlhttp://www.shnenglu.com/beautykingdom/services/trackbacks/97877.html  find /usr -type f -name string*
  你本意你xstring.c .h?什么之cȝ.是*是当通配W了.可是如果你的当前路径有个string.c文g的话,你就知道问题了?br>
[root@mip-123456 string]# ls
[root@mip-123456 string]# find /usr/src/linux-2.6.18/arch/ -type f -name string*
/usr/src/linux-2.6.18/arch/ppc/lib/string.S
/usr/src/linux-2.6.18/arch/ppc/boot/common/string.S
/usr/src/linux-2.6.18/arch/m68k/lib/string.c
/usr/src/linux-2.6.18/arch/cris/arch-v10/lib/string.c
/usr/src/linux-2.6.18/arch/cris/arch-v32/lib/string.c
/usr/src/linux-2.6.18/arch/s390/lib/string.c
/usr/src/linux-2.6.18/arch/powerpc/lib/string.S
/usr/src/linux-2.6.18/arch/powerpc/boot/string.h
/usr/src/linux-2.6.18/arch/powerpc/boot/string.S
[root@mip-123456 string]# touch string.h
[root@mip-123456 string]# find /usr/src/linux-2.6.18/arch/ -type f -name string*
/usr/src/linux-2.6.18/arch/powerpc/boot/string.h
[root@mip-123456 string]# find /usr/src/linux-2.6.18/arch/ -type f -name "string*"
/usr/src/linux-2.6.18/arch/ppc/lib/string.S
/usr/src/linux-2.6.18/arch/ppc/boot/common/string.S
/usr/src/linux-2.6.18/arch/m68k/lib/string.c
/usr/src/linux-2.6.18/arch/cris/arch-v10/lib/string.c
/usr/src/linux-2.6.18/arch/cris/arch-v32/lib/string.c
/usr/src/linux-2.6.18/arch/s390/lib/string.c
/usr/src/linux-2.6.18/arch/powerpc/lib/string.S
/usr/src/linux-2.6.18/arch/powerpc/boot/string.h
/usr/src/linux-2.6.18/arch/powerpc/boot/string.S
聪明的你已经看出问题了?br>
׃[0-9]q种匚w模式是出现在命o?argument位置?所以由shell负责解释(所以严D言, [0-9]是通配W?而不是正则表辑ּ)。对shell而言,l配W只Ҏ件名有效,也就是说,当shell遇到出现在某个命令行的argument位置上的通配W时,它先要去参数所指定的目录下搜烦所有已l存在的文g,所有文件名字与之匹配的都要替换到argument位置?q与很多标准的命令支持多个文件名参数是一致的),然后调用该命令执?
 
    对于mkdir ./dir[0-9]而言,shell无法在当前目录下扑ֈ与之匚w的文件名,所以就不替?dir[0-9]按照原样传给mkdirE序,所以mkdir徏立了一个名字ؓdir[0-9]的目?
 
    M一句话,通配W?出现在argument位置)由shell负责解释(与现有的文g名匹?,与具体的命o(ls,rm,mkdir)无关.正则表达?出现在option位置?由具体的应用E序解释(grep,sed,awk),与shell无关?/div>
 
一个试验的例子?
    如果当前目录下已l有一个名为dir5的目?执行 mkdir ./dir[0-9]?出现错误提示:mkdir: cannot create directory `./dir5': File exists q就证明?因ؓ存在dir5,所以shell匚wCdir5,所以真正执行的是mkdir ./dir5

seq -f 'dir%01g' 0 9 | xargs mkdir 
[victor@localhost tmp]$ ls
[victor@localhost tmp]$ seq -f 'dir%01g' 0 9 | xargs mkdir
[victor@localhost tmp]$ ls
dir0  dir1  dir2  dir3  dir4  dir5  dir6  dir7  dir8  dir9
 
seq 是Linux 中一個預a的外部命o,一般用作一堆數字的化寫法Q如
seq 1 10
便會出現
1
2
3
4
5
6
7
8
9
10
它還有三個選?br>  -f, --format=FORMAT      use printf style floating-point FORMAT (default: %g)
  -s, --separator=STRING   use STRING to separate numbers (default: \n)
  -w, --equal-width        equalize width by padding with leading zeroes
-f 最常用 , 例如一ơ制?10 個名 dir001 , dir002 .. dir010 的目錄,它便很有用?我們可以這樣
下一個命令便可了
seq -f 'dir%03g' 1 10 | xargs mkdir
?br>mkdir $(seq -f 'dir%03g' 1 10)
它用的是 printf 的格?, %03g' 代表以三位Q點數,以此ҎQ?/div>
如用bash3 ?printf也可作為{價命o
printf 'dir%03d\n' {1..10} | xargs mkdir  ?mkdir `printf 'dir%03d ' {1..10}`
awk 當然也可?br>awk 'BEGIN { while (num < 10 ) printf "dir%03d\n", ++num ; exit}' | xargs mkdir
這樣會比寫一個腳本快, 不必寫成
for dir in 001 002 003 004 005 006 007 008 009 010
do
    mkdir dir${dir}
done
转自Q?br>http://blog.chinaunix.net/u2/76292/showart_1931660.html




chatler 2009-10-05 11:05 发表评论
]]>date命o使用http://www.shnenglu.com/beautykingdom/archive/2009/06/19/88132.htmlchatlerchatlerFri, 19 Jun 2009 15:17:00 GMThttp://www.shnenglu.com/beautykingdom/archive/2009/06/19/88132.htmlhttp://www.shnenglu.com/beautykingdom/comments/88132.htmlhttp://www.shnenglu.com/beautykingdom/archive/2009/06/19/88132.html#Feedback0http://www.shnenglu.com/beautykingdom/comments/commentRss/88132.htmlhttp://www.shnenglu.com/beautykingdom/services/trackbacks/88132.html   (1)可以用date 061923122009Q即月日时分q?br>   (2)要是想用更详细的设|,可以用date -s '2009-06-19 23:09:00',q样可以讄到秒?

chatler 2009-06-19 23:17 发表评论
]]>
shell十三?lt;?gt;http://www.shnenglu.com/beautykingdom/archive/2009/06/02/86507.htmlchatlerchatlerTue, 02 Jun 2009 01:03:00 GMThttp://www.shnenglu.com/beautykingdom/archive/2009/06/02/86507.htmlhttp://www.shnenglu.com/beautykingdom/comments/86507.htmlhttp://www.shnenglu.com/beautykingdom/archive/2009/06/02/86507.html#Feedback0http://www.shnenglu.com/beautykingdom/comments/commentRss/86507.htmlhttp://www.shnenglu.com/beautykingdom/services/trackbacks/86507.html阅读全文

chatler 2009-06-02 09:03 发表评论
]]>
Linux Shell Learning Notes ---- Stringhttp://www.shnenglu.com/beautykingdom/archive/2009/06/01/86393.htmlchatlerchatlerMon, 01 Jun 2009 06:08:00 GMThttp://www.shnenglu.com/beautykingdom/archive/2009/06/01/86393.htmlhttp://www.shnenglu.com/beautykingdom/comments/86393.htmlhttp://www.shnenglu.com/beautykingdom/archive/2009/06/01/86393.html#Feedback0http://www.shnenglu.com/beautykingdom/comments/commentRss/86393.htmlhttp://www.shnenglu.com/beautykingdom/services/trackbacks/86393.htmlhttp://hi.baidu.com/wangyuquansky/blog/item/46863716e253e756f2de322a.html

1.字符串的操作Q?br>   1.1 字符串的cd
 / 数字或者数字组合(能够q回l果Q即E序退出状态是0Q说明属于这U类型,反之不然Q?br>$ i=5;j=9423483247234;
$ echo $i | grep [0-9]*
5
$ echo $j | grep [0-9]*
9423483247234
$ echo $j | grep [0-9]* >/dev/null
$ echo $?
0
// 字符l合Q小写字母、大写字母、两者的l合Q?br>$ c="A"; d="fwefewjuew"; e="fewfEFWefwefe"
$ echo $c | grep [A-Z]
A
$ echo $d | grep "[a-z]*"
fwefewjuew
$ echo $e | grep "[a-zA-Z]*"
fewfEFWefwefe
// 字母和数字的l合
$ ic="432fwfwefeFWEwefwef"
$ echo $ic | grep "[0-9a-zA-Z]*"
432fwfwefeFWEwefwef
// I格或者Tab键等
$ echo " " | grep " "

$ echo -e "\t" | grep "[[:space:]]" #[[:space:]]会同时匹配空格和TAB?br>
$ echo -e " \t" | grep "[[:space:]]"

$ echo -e "\t" | grep "<tab>" #<tab>为在键盘上按下TAB键,而不是字W?lt;tab>
// 匚w邮g地址
$ echo "test2007@lzu.cn" | grep "[0-9a-zA-Z\.]*@[0-9a-zA-Z\.]"
test2007@lzu.cn
// 匚wURL地址(以http链接ZQ?br>$ echo "http://news.lzu.edu.cn/article.jsp?newsid=10135" | grep "http://[0-9a-zA-Z\./=?]*"
http://news.lzu.edu.cn/article.jsp?newsid=10135

说明Q?br>[1] /dev/null?dev/zero是非常有的两个讑֤Q它们都犹如一个黑z,什么东西掉q去都会消失D尽Q后者则是一个能源箱Q你总能从那里取?Q直C退出。两者的部分用法见:关于zero及NULL讑֤的一些问?/u>
[2] [[:space:]]是grep用于匚wI格或者TAB键类型字W串的一U标讎ͼ其他cM的标记请查看grep的帮?man grep?br>[3] 上面都是用grep来进行模式匹配,实际上sed, awk都可以用来做模式匚wQ关于匹配中用到的正则匹配模式知识,大家可以参?a target=_blank>正则匚w模式Q更多相兌料请看参考资料?br>[4] 如果仅仅惛_断字W串是否为空Q即判断字符串的长度是否为零Q那么可以简单的通过test命o?z选项来判断,具体用法见test命oQman test.

概要CZ: 判断字符是否可打华ͼ如何控制字符在终端的昄?br>

// 用grep判断某个字符是否为可打印字符
$ echo "\t\n" | grep "[[:print:]]"
\t\n
$ echo $?
0
$ echo -e "\t\n" | grep "[[:print:]]"
$ echo $?
1
// 用echo?e选项在屏q控制字W显CZ|、颜艌Ӏ背景等
$ echo -e "\33[31;40m" #讄前景色ؓ黑色Q背景色为红?br>$ echo -e "\33[11;29H Hello, World\!" #在屏q的W?1行,29列开始打印字W串Hello,World!
// 在屏q的某个位置动态显C当前系l时?br>$ while :; do echo -e "\33[11;29H "$(date "+%Y-%m-%d %H:%M:%S"); done
// 用col命oqo掉某些控制字W,在处理诸如script,screen{截屏命令的输出l果Ӟ很有?br>$ screen -L
$ cat /bin/cat
$ exit
$ cat screenlog.0 | col -b   # 把一些控制字W过滤后Q就可以保留可读的操作日?/p>



更多关于字符在终端的昄控制ҎQ请参考资料[20]和字W显C实例[21]Q用shell实现的一个动态时钟?br>
1.2  字符串的长度

概要CZ: 除了l成字符串的字符cd外,字符串还有哪些属性呢Q组成字W串的字W个数。下面我们来计算字符串的长度Q即所有字W的个数Qƈ单介l几U求字符串中指定字符个数的方法?br>

// 计算某个字符串的长度Q即所有字W的个数[q计方法是五花八门Q择其优着而用之]
$ var="get the length of me"
$ echo ${var}     # q里{同?var
get the length of me
$ echo ${#var}
20
$ expr length "$var"
20
$ echo $var | awk '{printf("%d\n", length($0));}'
20
$ echo -n $var | wc -c
20
// 计算某些指定一个字W或者多个字W的个数
$ echo $var | tr -cd g | wc -c
2
$ echo -n $var | sed -e 's/[^g]//g' | wc -c
2
$ echo -n $var | sed -e 's/[^gt]//g' | wc -c
5
// 如果要统计单词个敎ͼ更多相关信息见《shell~程之数D》之 _单词l计_ 实例?br>$ echo $var | wc -w
5
$ echo "$var" | tr " " "\n" | grep get | uniq -c
1
$ echo "$var" | tr " " "\n" | grep get | wc -l
1



说明Q?br>${}操作W在Bash里头一?#8220;大牛”Q能胜Q相当多的工作Q具体就看看|中人的《shell十三问》之《Shell十三问》之"$(( )) ?$( ) 還有${ } 差在哪?" 吧?br>
1.3 字符串的存储

在我们看来,字符串是一q串的字W而已Q但是ؓ了操作方便,我们往往可以让字W串呈现Z定的l构。在q里Q我们不兛_字符串在内存中的实际存储l构Q仅仅关pd呈现出来的逻辑l构。比如,q样一个字W串Q?get the length of me"Q我们可以从不同的方面来呈现它?br>
1.3.1 通过字符在串中的位置来呈现它

q样我们可以通过指定位置来找到某个子丌Ӏ这在c语言里头通常可以利用指针来做。而在shell~程中,有很多可用的工具Q诸如exprQawk都提供了cM的方法来实现子串的查询动作。两者都几乎支持模式匚w(match)和完全匹?index)。这在后面的字符串操作中详l介l?br>
1.3.2 Ҏ某个分割W来取得字符串的各个部分

q里最常见的就是行分割W、空格或者TAB分割W了Q前者用来当行号Q我们似乎已l司I惯了Q因为我们的~辑器就q样“莫名”地处理着行分割符Q在 unix下ؓ\nQ在其他pȝ下有一些不同,比如windows下ؓ\r\n)。而空格或者TAB键经常用来分割数据库的各个字D,q似乎也是司I惯的事情?br>
正是因ؓq样Q所以生了大量优秀的行~辑工具Q诸如grep,awk,sed{。在“行内”Q姑且这么说吧,是处理单行Q即字符串里头不再包含行分割W)的字W串分割斚wQcut和awk提供了非怼的“行内”Q处理单行)处理能力?br>
1.3.3 更方便地处理用分割符分割好的各个部分

同样是用到分割符Q但Z更方便的操作分割以后的字W串的各个部分,我们抽象?#8220;数组”q么一个数据结构,从而让我们更加方便地通过下标来获取某个指定的部分。bash提供了这么一U数据结构,而优U的awk也同h供了它,我们q里简单介l它们的用法?br>
概要CZQ利用数l存?get the length of me"的用I格分开的各个部分?br>

//1. bash提供的数l数据结构,它是以数字ؓ下标的,和C语言?开始的下标一?br>$ var="get the length of me"
$ var_arr=($var)   #q里把字W串var存放到字W串数组var_arr中了Q默认以I格作ؓ分割W?br>$ echo ${var_arr[0]} ${var_arr[1]} ${var_arr[2]} ${var_arr[3]} ${var_arr[4]}
get the length of me
$ echo ${var_arr[@]}   #q个是整个字符串所有部分啦Q这里可以用*代替@Q下?br>get the length of me
$ echo ${#var_arr[@]}   #记得上面求某个字W串的长度么Q?操作W,如果x某个数组元素的字W串长度Q那么就把@换成下标?br>5
// 你也可以直接l某个数l元素赋?br>$ var_arr[5]="new_element"
$ echo ${var_arr[5]}
6
$ echo ${var_arr[5]}
new_element
// bash里头实际上还提供了一U类g“数组”的功能,?for i in 用指定分割符分开的字W串" 的用?br>// 卻I你可以很方便的获取某个字W串的某个部?br>$ for i in $var; do echo -n $i" "; done;
get the length of me

//2. awk里头的数l,注意比较它和bash提供的数l的异同
// split把一行按照空格分Ԍ存放到数lvar_arr中,q返回数l的长度。注意:q里的第一个元素下标不?Q而是1
$ echo $var | awk '{printf("%d %s\n", split($0, var_arr, " "), var_arr[1]);}'
5 get
// 实际上,上面的操作很cMawk自n的行处理功能Qawk默认把一行按照空格分割ؓ多个域,q可以通过$1,$2,$3...来获?$0表示整行
// q里的NF是该行的域的LQ类g上面数组的长度,它同h供了一U通过“下标”讉K某个字符串的功能
$ echo $var | awk '{printf("%d | %s %s %s %s %s | %s\n", NF, $1, $2, $3, $4, $5, $0);}'
5 | get the length of me | get the length of me
// awk?#8220;数组”功能何止于此呢,看看它的for引用吧,注意Q这个和bash里头的for不太一Pi不是元素本nQ而是下标
$ echo $var | awk '{split($0, var_arr, " "); for(i in var_arr) printf("%s ",var_arr);}'
get the length of me
$ echo $var | awk '{split($0, var_arr, " "); for(i in var_arr) printf("%s ",i);}'
1 2 3 4 5
// awkq有?#8220;厉害”的处理能力,它的下标可以不是数字Q而可以是字符Ԍ从而变成了“兌”数组Q这U?#8220;兌”的作用在某些方便让我们非常方便
// 比如Q我们这里就实现一个非凡的应用Q把某个文g中的某个pȝ调用名替换成地址Q如果你真正用v它,你会感慨它的“鬼斧工”的?br>// q就是我在一个场合最好才发现的随好的实现ҎQ有兴趣看看awk手册帖子中我?楼回复的实例吧?br>$ cat symbol
sys_exit
sys_read
sys_close
$ ls /boot/System.map*
$ awk '{if(FILENAME ~ "System.map") map[$3]=$1; else {printf("%s\n", map[$1])}}' /boot/System.map-2.6.20-16-generic symbol
c0129a80
c0177310
c0175d80
// 另外Qawkq支持删除某个数l元素,如果你不用了可以用delete函数l删除掉。如果某些场合有需要的话,别忘了awkq支持二l数l?br>



okayQ就介绍到这里啦。ؓ什么要介绍q些内容Q再接着看下面的内容Q你׃发现Q那些有些的工具是怎么产生和发展v来的了,如果累了Q看看最后一参考资料吧Q它介绍了一些linux命o名字的由来,说不定可以帮助你理解本节下面的部分呢?br>
2. 字符串常规操?br>
字符串操作包括取子串、查询子丌Ӏ插入子丌Ӏ删除子丌Ӏ子串替换、子串比较、子串排序、子串进制{换、子串编码{换等?br>
2.1 取子?/font>

概要CZQ取子串的方法主要有Q直接到指定位置求子Ԍ字符匚w求子丌Ӏ?br>

// 按照位置取子Ԍ比如从什么位|开始,取多个字符
$ var="get the length of me"
$ echo ${var:0:3}
get
$ echo ${var:(-2)}   # 方向相反?br>me
$ echo `expr substr "$var" 5 3` #记得?var引v来,否则expr会因为空D解析错?br>the
$ echo $var | awk '{printf("%s\n", substr($0, 9, 6))}'
length

// 匚w字符求子?br>$ echo ${var%% *} #从右边开始计,删除最左边的空格右边的所有字W?br>get
$ echo ${var% *} #从右边开始计,删除W一个空格右边的所有字W?br>get the length of
$ echo ${var##* } #从左边开始计,删除最双的空格左边的所有字W?br>me
$ echo ${var#* } #从左边开始计,删除W一个空格左边的所有字W?br>the length of me

$ echo $var | awk '{printf("%s\n", $1);}' # awk?var按照I格分开为多个变量,依次?1,$2,$3,$4,$5
get
$ echo $var | awk '{printf("%s\n", $5);}'
me

$ echo $var | cut -d" " -f 5 #差点把cutq个东西忘记啦Q用h和awkcM, -d指定分割W,如同awk?F指定分割W一P-f指定“?#8221;Q如同awk?数字?br>
$ echo $var | sed 's/ [a-z]*//g' #删除所?I格Q字母串 的字W串Q所以get后面的全部被删除?br>get
$ echo $var | sed 's/[a-z]* //g'
me

$ echo $var | tr " " "\n" | sed -n 1p #sed有按地址Q行Q打?p)的功能,记得先用tr把空格换成行?br>get
$ echo $var | tr " " "\n" | sed -n 5p
me

// tr也可以用来取子串哦,它也可以cM#??#8220;拿掉”一些字W串来实现取子串
$ echo $var | tr -d " "
getthelengthofme
$ echo $var | tr -cd "[a-z]" #把所有的I格都拿掉了Q仅仅保留字母字W串Q注?c?d的用?br>getthelengthofme



说明Q?br>[1] %?的区别是Q删除字W的方向不一?前者在叻I后者在左,%%?,##?的方向是前者是最大匹配,后者是最匹配?好的记忆Ҏ见网中h的键盘记忆法:#$%是键盘依ơ从左到右的三个?
[2] tr?c选项是complement的羃写,即invertQ?d选项是删除的意思,tr -cd "[a-z]"q样一来就变成保留所有的字母啦?br>
对于字符串的截取Q实际上q有一些命令,如果head,tail{可以实现有意思的功能Q可以截取某个字W串的前面、后面指定的行数或者字节数。例如:

$ echo "abcdefghijk" | head -c 4
abcd
$ echo -n "abcdefghijk" | tail -c 4
hijk



2.2. 查询子串

概要CZQ子串查询包括:q回W合某个模式的子串本w和q回子串在目标串中的位置?br>
准备Q在q行下面的操作之前,hhttp://oss.lzu.edu.cn/blog/blog.php?do_showone/tid_1385.html链接中的内容复制C个文本text里头Q用于下面的操作?br>

// 查询子串在目标串中的位置
$ var="get the length of me"
$ expr index "$var" t       #貌似仅仅可以q回某个字符或者多个字W中W一个字W出现的位置
3
$ echo $var | awk '{printf("%d\n", match($0,"the"));}'   #awk却能扑և字串,matchq可以匹配正则表辑ּ
5

// 查询子串Q返回包含子串的?awk,sed都可以实现这些功?但是grep最擅长Q?br>$ grep "consists of" text   # 查询text文g包含consists of的行Qƈ打印q些?br>$ grep "consists[[:space:]]of" -n -H text # 打印文g名,子串所在行的行号和该行的内?br>$ grep "consists[[:space:]]of" -n -o text # 仅仅打印行号和匹配到的子串本w的内容
$ awk '/consists of/{ printf("%s:%d:%s\n",FILENAME, FNR, $0)}' text #看到没?和grep的结果一?br>$ sed -n -e '/consists of/=;/consists of/p' text #同样可以打印行号



说明Q?br>[1] awk,grep,sed都能通过模式匚w查找指定的字W串Q但是它们各有擅长的领域Q我们将在后l的章节中l用和比较它们Q从而发现各自的优点?br>[2] 在这里我们姑且把文g内容当成了一个大的字W串Q在后面的章节中我们专门介l文件的操作Q所以对文g内容中存攑֭W串的操作将会有更深入的分析和介l?br>
2.3. 子串替换

子串替换是把某个指定的子串替换成其他的字符Ԍ实际上这里就蕴含?#8220;插入子串”?#8220;删除子串”的操作。例如,你想插入某个字符串到某个子串之前Q就可以把原来的子串替换?#8221;子串+新的字符?#8220;Q如果想删除某个子串Q就把子串替换成IZ。不q有些工h供了一些专门的用法来做插入子串和删除子串的操作Q所以呆伙还是会专门介绍的。另外,要想替换掉某个子Ԍ一般都是先扑ֈ子串Q查询子ԌQ然后再把它替换掉的Q实质上很多工具在用和设计上都体现了这么一炏V?br>
概要CZQ下面我们把变量var中的I格替换成下划线看看?br>

// 用{}q算W,q记得么Q网中h的教E?br>$ var="get the length of me"
$ echo ${var/ /_}       #把第一个空格替换成下划U?br>get_the length of me
$ echo ${var// /_}       #把所有空格都替换成了下划U了
get_the_length_of_me

// 用awkQawk提供了{换的最替换函数sub和全局替换函数gsubQ类??/
$ echo $var | awk '{sub(" ", "_", $0); printf("%s\n", $0);}'
get_the length of me
$ echo $var | awk '{gsub(" ", "_", $0); printf("%s\n", $0);}'
get_the_length_of_me

// 用sed了,子串替换可是sed的特?br>$ echo $var | sed -e 's/ /_/'   #s <= substitude
get_the length of me
$ echo $var | sed -e 's/ /_/g'   #看到没有Q简短两个命令就实现了最匹配和最大匹配g <= global
get_the_length_of_me

// 有忘记tr命o么?可以用替换单个字W的
$ echo $var | tr " " "_"
get_the_length_of_me
$ echo $var | tr '[a-z]' '[A-Z]'   #q个可有意思了Q把所有小写字母都替换为大写字?br>GET THE LENGTH OF ME



说明Qsedq有很有的标签用法呢,下面再介l吧?br>
有一U比较有意思的字符串替换是Q整个文件行的倒置Q这个可以通过tac命o实现Q它会把文g中所有的行全部倒{q来。在一定意义上来说Q排序实际上也是一个字W串替换?br>
2.4. 插入子串

插入子串Q就是在指定的位|插入子Ԍq个位置可能是某个子串的位置Q也可能是从某个文g开头算L某个长度。通过上面的练习,我们发现q两者之间实际上是类似的?br>
公式Q插入子??old子串"替换?old子串+new子串"或?new子串+old子串"

概要CZQ:下面在var字符串的I格之前或之后插入一个下划线

// 用{}
$ var="get the length of me"
$ echo ${var/ /_ }       #在指定字W串之前插入一个字W串
get_ the length of me
$ echo ${var// /_ }
get_ the_ length_ of_ me
$ echo ${var/ / _}       #在指定字W串之后插入一个字W串
get _the length of me
$ echo ${var// / _}
get _the _length _of _me

// 其他的还用演CZQ这里主要介lsed怎么用来插入字符吧,因ؓ它的标签功能很有?br>$ echo $var | sed -e 's/\( \)/_\1/' #\(和\)不匚w到的字符串存放ؓ一个标{,按匹配顺序ؓ\1,\2...
get_ the length of me
$ echo $var | sed -e 's/\( \)/_\1/g'
get_ the_ length_ of_ me
$ echo $var | sed -e 's/\( \)/\1_/'
get _the length of me
$ echo $var | sed -e 's/\( \)/\1_/g'
get _the _length _of _me

// 看看sed的标{序是不是\1,\2....Q看到没Q\2和\1掉换位置后,the和get的位|掉换了
$ echo $var | sed -e 's/\([a-z]*\) \([a-z]*\) /\2 \1 /g'
the get of length me
// sedq有专门的插入指令,a和i,分别表示在匹配的行后和行前插入指定字W?br>$ echo $var | sed '/get/a test'
get the length of me
test
$ echo $var | sed '/get/i test'
test
get the length of me


2.5. 删除子串删除子串Q应该很单了吧,把子串替换成“I?#8221;Q什么都没有Q不变成了删除么。还是来单复习一下替换吧。概要示例:Q把var字符串中所有的I格l删除掉。鼓励:q样一替换不知道变成什么单词啦Q谁认得呢?但是中文却是q在一LQ所以中文有多难Q你惛_了么Q原来你也是个语a天才Q而英语ƈ不可怕,你有学会它的天赋Q只要你有这个打。如果要删除掉第一个空格后面所有的字符串该怎么办呢Q还记得{}??用法么?如果不记得,回到q一节的q头开始复习吧。(实际上删除子串和取子串未不是两U互补的q算呢,删除掉某些不惌的子Ԍ也就同时取得另外那些惌的子东y—这个世界就是一?#8220;二元”的世界,非常有趣Q这个很单:q记得test命o的用法么Qman test。它可以用来判断两个字符串是否相{的。另外,你发C“字符串是否相{?#8221;?#8220;字符串能否跟另外一个字W串匚w"两个问题之间的关pdQ如果两个字W串完全匚wQ那么这两个字符串就相等了。所以呢Q上面用到的字符串匹配方法,也同样可以用到这里。差点忘记这个重要的内容了,子串排序可是l常用到的,常见的有按字母序、数字序{正序或反序排列。sort命o可以用来做这个工作,它和其他行处理命令一P是按行操作的Q另外,它类似cut和awkQ可以指定分割符Qƈ指定需要排序的列。如果字母和数字字符用来计数Q那么就存在q制转换的问题。在数D一节的回复资料里,我们已经介绍了bc命oQ这里再单的复习一下。说明:ibase指定输入q制Qobase指出输出q制Q这样通过调整ibase和obaseQ你x么转就怎么转啦Q什么是字符~码Q这个就不用介绍了吧Q看q那些ؕ七八p显C的|页么?大多是因为浏览器昄时的”~码“和网实际采用的”~码“不一致导致的。字W编码通常是指把一序列”可打?#8220;字符转换成二q制表示Q而字W解码呢则是执行相反的过E,如果q两个过E不匚wQ则出现了所谓的”q“。ؓ了解?#8221;q“问题呢?需要进行编码{换。在linux下,我们可以使用iconvq个工具来进行相x作。这L情况l常在不同的操作pȝ之间Ud文gQ不同的~辑器之间交换文件的时候遇刎ͼ目前在windows下常用的汉字~码是gb2312Q而在linux下则大多采用utf8。说明:我的l端默认~码是utf8Q所以结果如上。实际上Q在用Bash~程Ӟ大部分时间都是在处理字符Ԍ因此把这一节熟l掌握非帔R要。范例演C:处理URL地址URL地址 (URLQUniform Resoure LocatorQ统一资源定位器)是WWW늚地址)几乎是我们日常生zȝ玩伴Q我们已l到了无法离开它的地步啦,对它的操作很多,包括判断URL地址的有效性,截取地址的各个部分(服务器类型、服务器地址、端口、\径等Qƈ对各个部分进行进一步的操作。下面我们来具体处理q个URL地址Q有了上面的知识Q我们就可以非常Ҏ地进行这些工作啦Q修Ҏ个文件的文g名,比如调整它的~码Q下载某个网里头的所有pdf文{。这些就作ؓl习自己做吧Q如果遇到问题,可以在回帖交。相应地可以参考这个例子:[1] 用脚本下载某个网中的英文原?pdf文Q^时做工作Q大多数时候处理的都是一?#8220;格式?#8221;的文本,比如cM/etc/passwdq样的有固定行和列的文本Q也有类似tree命o输出的那U具有树形结构的文本Q当然还有其他具有特定结构的文本。关于树状结构的文本的处理,可以考虑看看q两个例子: [1] 用AWK转换树Ş数据成关p表[2] 用Graphvizq行可视化操作──l制函数调用关系囑֮际上Q只要把握好Ҏ结构的一些特点,q根据具体的应用场合Q处理v来就不会困难。下面我们来介绍具体有固定行和列的文本的操作Q以/etc/passwd文gZ。关于这个文件的帮忙和用P请通过man 5 passwd查看。下面我们对q个文g以及相关的文件进行一些有意义的操作。上面涉及到了处理某格式化行中的指定列,包括截取Q如SQL的select用法Q,q接Q如SQL的join用法Q,排序Q如SQL的order by用法)Q都可以通过指定分割W来拆分某个格式化的行,另外Q?#8220;截取”的做法还有很多,不光是cutQawkQ甚至通过IFS指定分割W的read命o也可以做刎ͼ例如Q因此,熟悉q些用法Q我们的工作变得非常灵zL。到q里Q需要做一个简单的l习Q如何把按照列对应的用户名和用户ID转换成按照行对应的,xcM下面的数据:转换成:q{换回去,有什么办法呢Q记得诸如trQpaste,split{命令都可以使用。参考方法:Q正转换Q先截取用户名一列存入文件userQ再截取用户ID存入idQ再把两个文件用paste -s命oq在一Pq样完成了正{换。*逆{换:先把正{换得到的l果用split -1拆分成两个文Ӟ再把两个拆分后的文g用tr把分割符"\t"替换?\n"Q只有用paste命o把两个文件连在一Pq样完成了逆{换。更多有的例子Q可以参考该序列W一部分的回复,卛_考资料[16]的回复,以及兰大开源社区镜像站用的镜像脚本Q即参考资料[17]Q另外,参考资料[18] 关于用Shell实现一个五W反查小工具也值得阅读和改q?br>



chatler 2009-06-01 14:08 发表评论
]]>
sed使用心得<?gt;http://www.shnenglu.com/beautykingdom/archive/2009/04/01/78546.htmlchatlerchatlerWed, 01 Apr 2009 03:53:00 GMThttp://www.shnenglu.com/beautykingdom/archive/2009/04/01/78546.htmlhttp://www.shnenglu.com/beautykingdom/comments/78546.htmlhttp://www.shnenglu.com/beautykingdom/archive/2009/04/01/78546.html#Feedback0http://www.shnenglu.com/beautykingdom/comments/commentRss/78546.htmlhttp://www.shnenglu.com/beautykingdom/services/trackbacks/78546.htmlsed 是一UUNIX/LINUX q_下的轻量U流~辑器,日常一般用于处理文本文件。sed 有许多很好的Ҏ。首先,它相当小巧;其次Q?sed 可以配合强大?shell 完成许多复杂的功能。在我看来,sed完全可以看成一个脚本解释器Q用cM于编E的手段完成许多事情?/font>

sed单示?/strong>

sed命o的格式是
sed [-options] [command] [stdin]
比如q个例子
$ sed –e ‘d’ ./Mydir/Myfile
执行该命令,得不到M输出。在该例中,用一个编辑命?'d' 调用 sedQsed 打开 ./Mydir/Myfile 一行读入其模式~冲区,执行’d’Q?#8220;删除?#8221;Q;然后打印模式~冲区(~冲区已为空Q;它对后面的每一行重复这些步骤,q不会生输出!
对这个命令要说明的几ҎQ首先,它根本没有修?./Mydir/Myfile。这是因?sed 是流处理器,它只d在命令行指定的文Ӟ它不试图修改该文件。其ơ, sed 是面向行的,'d' 命o不是单地告诉 sed 一下子删除所有输入数据;相反Qsed 逐行?./Mydir/Myfile 的每一行读入其UCؓ模式~冲区的内部~冲区,一旦将一行读入模式缓冲区Q它执?'d' 命oQ然后打印模式缓冲区的内宏V最后要注意的事是括?'d' 命o的单引号的用法,q样可以用 shell 扩展?/font>

指定sed的作用范?/strong>

看下面的三个例子
 $ sed –e ‘1d’ ./Mydir/Myfile
 $ sed –e ‘1,10d’ ./Mydir/Myfile
 $ sed –e ‘/begin/,/end/p’ ./Mydir/Myfile
W一个例子说明只删除./Mydir/MyfileW一行的~冲Q第二个例子删除第1~10行的~冲。第三个例子最复杂Q它定义了以字符?#8217;begin’开始到’end’l束的作用范?/font>

sed中的正则表达?/strong>

sed支持正则表达式,比如
 $ sed –n -e ‘/regexp/p’ ./Mydir/Myfile
比如要删除所有的I
 $ sed –e ‘/^$/d’ ./Mydir/Myfile
sed中的一些特D定义是
    规则 表达?nbsp;   描述
    /./       与包含臛_一个字W的M行匹?br>    /../      与包含臛_两个字符的Q何行匚w
    /^#/      与?'#' 开始的M行匹?br>    /^$/      与所有空行匹?br>    /}^/      与?'}'Q无I格Q结束的M行匹?br>    /} *^/    与?'}' 后面跟有 零或多个I格l束的Q何行匚w
    /[abc]/   与包含写 'a'?b' ?'c' 的Q何行匚w
    /^[abc]/  与?'a'?b' ?'c' 开始的M行匹?/em>
再比如一个经典的例子Q打印c源代码中的main函数内容Q其命o可以写成如下
 $ sed –n –e ‘/main[[:space]]*(/,/^}/p’ ./Mydir/*.c
其中[:space]表示I格Q[[:space]]*表示?~多个I格Q所以main[[:space]]*(的意思是匚w“main (”字符Ԍ“^}”表示q一行有且只有一个字W}。当Ӟ上面的命令不是十分严谨?/font>

sed –e ‘s/regexp/repalcement’ file

替换是sed命o中最常用的命令,比如如下的例?br> $ sed –e ‘s/a/b’ ./Mydir/Myfile
 $ sed –e ‘s/a/b/g’ ./Mydir/Myfile
W一个命令将./Mydir/Myfile中每一行第一ơ出现的字符a替换成字WbQ第二个命o׃加入?#8217;/g’Q表C是全局Q全部)替换字符a成字Wb?/font>

l常q可以看见如下两UŞ式的sed
 $ sed –e ‘1,10s/a/b’ ./Mydir/Myfile
 $ sed –e ‘/^$/,/^END/s/a/b/g’ ./Mydir/Myfile
W一个命令是指替?~10行;W二个命令是指全局替换从空行开始到以END开始的行中的内宏V?/font>

替换命o不一定非要以/分隔Q比?br> $ sed –e ‘s:usr/local:/usr:g’ ./Mydir/Myfile
是?/Mydir/Myfile中的usr/local全部替换?usr

要用好替换命令,当然要用正则表辑ּQ除了上面所说的表达式的例子Q还有一些是非常有用?br>    字符c?nbsp;  描述
    [:alnum:]  字母数字 [a-z A-Z 0-9]
    [:alpha:]  字母 [a-z A-Z]
    [:blank:]  I格或制表键
    [:cntrl:]  M控制字符
    [:digit:]  数字 [0-9]
    [:graph:]  M可视字符Q无I格Q?br>    [:lower:]  写 [a-z]
    [:print:]  非控制字W?br>    [:punct:]  标点字符
    [:space:]  I格
    [:upper:]  大写 [A-Z]
    [:xdigit:]  十六q制数字 [0-9 a-f A-F]

比如下面q个例子
 $ sed –e ‘s/<[^>]*>//g’ ./Mydir/Myfile
< [^>]*>匚w<…>q样的字W串Q?#8230;中不?gt;Q。运行这个命令,能够?“<b>This</b> is what <b>I</b> meant.”q样的字W串替换?#8220;This is what I meant.”

考察如下的命?br> $ sed -e 's/.*/# &/' ./Mydir/Myfile
q个命o所有的非空行以“#”注释掉—?amp;告诉sed在行首插入字W?/font>

‘s///’允许我们在规则表辑ּ中定义区域,然后可以在替换字W串中引用这些特定区域。这些区域是以\(和\)隔开的?br>比如定义三个匚w非空字符的区?\(.*\) \(.*\) \(.*\)'Q现在可以定义这三个区域的动作,比如
 $ sed -e 's/\(.*\) \(.*\) \(.*\)/PreFix \1-\2 Fix \3/' ./Mydir/Myfile
假如把三个区域分别命名ؓa、b、cQ则最后结果是 PreFix a-b Fix c

sed中组合命?/strong>

sed中的命o可以l合Q以Q号隔开Q比?br> $ sed –n –e ‘=;p’ ./Mydir/Myfile
=表示打印行号Qp表示打印。对于更复杂的指令,则可以写成命令脚本,然后?f选项导入Q比?br> $ sed –n –f MyScript.sed ./Mydir/Myfile
对于同一个地址上的操作Q则可以用{}l合Q比?br> $ sed –n ‘1,20{ s/samba/Samba/g  s/posix/POSIX/g }’ ./Mydir/Myfile

sed中的行附加命?/strong>

在当前行之前插入?#8220;i\”Q如果要插入多行Q则多行用\分隔
在当前行之后插入?#8220;a\”Q用法和上面怼
更改当前?#8220;c\”



chatler 2009-04-01 11:53 发表评论
]]>
ĻȾþþþþþ| ɫۺϾþ| ܻƺ۵վþmimiɫ| Ʒþþþ龫Ʒ| ŷƷ˿þþĻ| ҹƷþþþ| þ޾ƷĻ| ˾þô߽ۺĻ| 뾫ƷþɪӰ | þerƵᆱƷ| Ʒѿþþ㽶| ˾þô߽avһ| Ʒ99þþƷ| ƷëٸAVѾþ | þӰԺþ㽶߿ۿ| þ99ۺϾƷҳ| Ʒþþþþ޾Ʒ| aëƬ÷˾þ| þۺɫ| þþƷަvDz | þ㽶߿ۿƷyw | ޾þˬ˾Ʒ | þóӰԺƷ777| þù޾Ʒ| 99Ʒþ| Ʒþþþþ| ƷۺϾþõһҳ| ɫþAVۺ| һaɫƬþٸһHƬѷ | þ99Ʒ| þþƷƵһ| þɫ| þĻ| Ʒ99þþþ | պ뾫Ʒþһ | Ʒٸavþ| Ʒ99þþþþլС˵| 99þùۺϾƷˮ| ҰĻþ| þۺϺݺۺϾþ| ľþþþר|