搜尋此網誌

2010年12月30日 星期四

Command -- trap

man trap, trap --help都没有,网上搜到格式如下:
trap "command" signal
于是有

  1. #!/bin/bash
  2. trap "echo \"hello world\"; echo $1" SIGKILL
  3. while : ; do
  4.   sleep 1
  5. done
  6.  
  7. $ ./test abc&
  8. $ kill 11219
额。。。没反应!
原来kill 命令发出信号SIGTERM,如果想用SIGKILL需要执行kill -9。
再次运行后结果为:

  1. $ ./test abc&
  2. $ kill -9 112424
  3. $ hello world
  4. abc
trap为信号捕捉器,当接收到指定信号后执行""中的命令。

2010年12月28日 星期二

Command -- find

1. 想查看当前文件夹及子文件夹里有没有文件名为“abc”的文件
# find . -name abc
. :表示当前目录
-name:表示要根据名称查找
2. 想查看当前文件夹及子文件夹里有没有”xyz”目录
# find . -type d -name xyz
-type:表示设定类型,d表示文件夹类型,可以替换为f(普通文件)、l(链接文件)
3. 想找出当前文件夹及子文件夹里所有后缀是”.txt”的文件
# find . -name “*.txt”
4. 想查找当前目录及其子文件夹中“roc”用户自己的文件有哪些
# find . -user roc
-user:用于设定所属用户的名称,此处可替换为-group,即所属用户组的名称
5. 想查找当前文件夹及子文件夹里权限设定为755的所有文件

# find . -perm 755
-perm:用于设定权限
6. 想查找当前文件夹及子文件夹里的同时含有b字符和3字符的文件:用到正则表达式技术
# find . -regex ‘.*b.*3′
-regex:表示使用正则表达式进行匹配。请注意,此命令会和“全 路径”进行匹配,也就是说前面要加.*,因为输出结果中会有“./”符号。
7. 如果想全部输出用find命令查找出的”*.abc”文件的内容
# find . -type f -name “*.abc” -exec cat {} \;
输出/tmp/code中所有.h,.c文件长度的总和
# find /tmp/code -name '*.[ch]' -exec wc -l {} \; | awk '{n+=$1} END{print n}'
-exec 表示由find找到的匹配项会作为“-exec后面设定的命令”的参数
可以使用-ok代替-exec,这样对每个匹配项进行操作,都会要求用户确认(y/n).
命令最后的{} \; 别忘了写,其中{}代表用find查找到的结果中的每一个查找项。
8. 查找当前目录下在5分钟内被访问过的文件
# find . -amin -5
访问过用amin,修改过用mmin,文件状态改变过用cmin
精确到分钟的用amin,mmin,cmin,精确到天的用atime,mtime,ctime
在5分钟之内的用-5,在5分钟以上的用+5
9. 想查找当前目录及子目录下文件大小大于10M的所有文件
# find . -size +10000000c
-size:表示文件大小,+表示大于某个数,-表示小于某个数。c表示单位是字节,你可以将c换成k,M,G。
10. 上述所有的find命令都是查找当前目录及其子目录。如果不想深入到子目录中,而是只查找当前一层目录,则可以:
# find . -maxdepth 1 -name “*.c”

Linux system admin command(basic)

Linux Command
1. output files
cat -- concatenate files and print on the standard output
tac -- concatenate and print file in reverse

nl -- number lines of file
head -- output the first part of file
tail -- output the last part of file


2. summarizing files
wc -- print newline, word, and byte counts for each file
     eg. $wc -l -c test      30(line) 557(byte) test

3. sort files
sort -- sort lines of text files

eg.
sort缺省默认空格和tab键为分隔符。其他方式分隔,使用-t选项。缺省以第1列来排序,即-k1
-n 指定分类是域上的数字分类。
如编辑文件1111.txt
sdsad 311 315 asd3f
wdasd 551 133 adsff
sdsad 606 44 fgfdgdf
wdwew 77 599 gghgf
eeese 23 22 fgdf
eeese 23 22 fgdf
dfdff 78 55 fdgd
   -k 使用k做分类排序,如按第2列来分类排序
$ sort -k2 1111.txt
eeese 23 22 fgdf
eeese 23 22 fgdf
sdsad 311 315 asd3f
wdasd 551 133 adsff
sdsad 606 44 fgfdgdf
wdwew 77 599 gghgf
dfdff 78 55 fdgd
    -n 指定分类列上按数值来分类排序,如第按第2列数值大小来分类
$ sort -k2n 1111.txt
eeese 23 22 fgdf
eeese 23 22 fgdf
wdwew 77 599 gghgf
dfdff 78 55 fdgd
sdsad 311 315 asd3f
wdasd 551 133 adsff
sdsad 606 44 fgfdgdf
    -u 去除重复的行,即完全一样的行,只保留一行
$ sort -k2n -u 1111.txt
eeese 23 22 fgdf 只有1行了
wdwew 77 599 gghgf
dfdff 78 55 fdgd
sdsad 311 315 asd3f
wdasd 551 133 adsff
sdsad 606 44 fgfdgdf

4. unique files
uniq --  report or omit repeated lines
        -d:  only print duplicate lines
       -u:  only print unique lines
5. compare filesdiff -- compare files line by line
     -y: output in two colums
      -c: output lines of copied context (
上下文输出格式)
      -u: output lines of unified context
eg.
a.txt
    abc
    hello
b.txt
    cba
    hello
$ diff -y a.txt b.txt -W 50
abc              |    cba
hello            hello

$ diff -c a.txt b.txt
*** a.txt    2010-12-13 22:15:13.000000000 +0800
--- b.txt    2010-12-13 22:15:21.000000000 +0800
***************
*** 1,2 ****
! abc
  hello
--- 1,2 ----
! cba
  hello

$ diff -u a.txt b.txt
--- a.txt    2010-12-13 22:15:13.000000000 +0800
+++ b.txt    2010-12-13 22:15:21.000000000 +0800
@@ -1,2 +1,2 @@
-abc
+cba
 test

6. operating on characters
tr -- translate or delete characters
      -c: 取SET1的反义,所有不在SET1中的字符
      -d:
delete characters in SET1
      -s:
浓缩重复的字符。如果标准输入中连续重复出现SET1里所列的字符,则将其浓缩成一个。或者将其浓缩成SET1中的字符
ps:
$echo "chennnrui123" | tr -d "cr123"
hennnui
$echo "chennnrui123" | tr -s "[a-z]"
chenrui123
$echo "abc123def" | tr -cs "[a-z]" " "
abc
def
$echo "abc123def" | tr -cs "[a-z]" " "
abc


def


Others

alias -- redefine command
eg.   alias ls='ls -lh'

bash学习笔记(五)—— awk

awk简介

awk命令行的程序模型

awk [-F field-separator] 'commands' input-file(s)-F 指定域分隔符,可选,默认为空格。
commands的命令格式为:/pattern/{actions} 
condition{actions}pattern是正则表达式,actions是一系列操作。
awk程序一行一行读出待处理文件,如果某一行与pattern匹配,或者满足condition条件,
则执行相应的actions,如果一条awk命令只有actions部分,则actions作用于待处理文件的每一行。
例:
testfile文件内容为
ProductA  30  aaa
ProductB  76  bbb
ProductC  55  ccc
打印每一行的第二列:
$ awk '{print $2;}' testfile
30
76
55
自动变量$1$2分别表示第一列、第二列等,类似于Shell脚本的位置参数,而$0表示整个当前行。
$ awk '$2<75 {printf "%s\t%s\n", $0, "REORDER";} $2>=75 {print $0;}' testfile
ProductA 30 aaa REORDER
ProductB 76 bbb
ProductC 55 ccc REORDER
awk命令的condition部分还可以是两个特殊的conditionBEGINEND,对于每个待处理文件,BEGIN后面的actions在处理整个文件之前执行一次,END后面的actions在整个文件处理完之后执行一次。
awk 'BEGIN {print "name belt -----"}{print $1" "$3} END {print "end"}' testfile
name belt -----
ProductA aaa
ProductB bbb
ProductC ccc
end

ps: 注print与printf的区别

初次awk时,可能会经常出现错误,在碰到错误时,可以按以下方式查找:

!确保整个awk命令用单引号括起来
!确保命令内所有引号成对出现
!确保用花括号括起动作语句,用圆括号括起条件语句
!确保文件路径正确
awk有许多内置变量设置环境信息。这些变量可以被改变。下面是一些常用的内置变量。

ARGC         命令行参数个数
ARGV         命令行参数排列
EVVIRON      支持队列中系统环境变量的使用
FILENAME     awk浏览的文件名
FNR          浏览文件的记录数
FS           设置输入域分隔符,等价于命令行-F选项
NF           浏览记录的域个数
NR           已读的记录数
OFS          输出域分隔符
ORS          输出记录分隔符
RS           控制记录分隔符
例:
$ awk 'END {print NR}' testfile3
$ awk '{print NF} END {print FILENAME}' testfile
3
3
3
testfile

bash学习笔记(四)—— cut

cut简介
cut是以每一行为一个处理对象的,这种机制和sed是一样的。
cut命令主要是接受三个定位方法:
第一,字节(bytes),用选项-b
第二,字符(characters),用选项-c
第三,域(fields),用选项-f
以“字节”定位标志,例
$who
rocrocket :0 2009-01-08 11:07
rocrocket pts/0 2009-01-08 11:23 (:0.0)
rocrocket pts/1 2009-01-08 14:15 (:0.0)

如果我们想提取每一行的第3个字节,就这样:
$ who|cut -b 3
c
c
c

如果“字节”定位中,提取第3,第4、第5和第8个字节,则:
$ who|cut -b 3-5,8
croe
croe
croe

注意,cut命令如果使用了-b选项,那么执行此命令时,cut会先把-b后面所有的定位进行从小到大排序,然后再提取。
以“字符”为定位标志,例:
$ who|cut -c 3-5,8
croe
croe
croe

不过,看着怎么和-b没有什么区别啊?莫非-b和-c作用一样? 其实不然,看似相同,只是因为这个例子举的不好,who输出的都是单字节字符,所以用-b和-c没有区别,如果你提取中文,区别就看出来了,来,看看中文提取的情况:
$ cat cut_ch.txt
星期一
星期二
星期三
星期四
[rocrocket@rocrocket programming]$ cut -b 3 cut_ch.txt
�
�
�
�
[rocrocket@rocrocket programming]$ cut -c 3 cut_ch.txt




看到了吧,用-c则会以字符为单位,输出正常;而-b只会傻傻的以字节(8位二进制位)来计算,输出就是乱码。

以“域”为定位标志:
为什么会有“域”的提取呢,因为刚才提到的-b和-c只能在固定格式的文档中提取信息,而对于非固定格式的信息则束手无策。这时候“域”就派上用场了。
以/etc/passwd的前五行内容为例:
$ cat /etc/passwd|head -n 5
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
$ cat /etc/passwd|head -n 5|cut -d : -f 1
root
bin
daemon
adm
lp

用-d来设置间隔符为冒号,然后用-f来设置我要取的是第一个域。
当然,在设定-f时,也可以使用例如3-5或者4-类似的格式:
$ cat /etc/passwd|head -n 5|cut -d : -f 1,3-5,7
root:0:0:root:/bin/bash
bin:1:1:bin:/sbin/nologin
daemon:2:2:daemon:/sbin/nologin
adm:3:4:adm:/sbin/nologin
lp:4:7:lp:/sbin/nologin

bash学习笔记(三)—— 基本语法

变量,判断,重复动作

参数展开是shell提供变量值在程序中使用的过程。如
aa="hello word"
sleep 10
echo $aa 或 "$aa"
变量展开需用"",如果改为'',则不会展开。echo '$aa',输出为'$aa'

替换运算符


${varname:-word}
如果varname存在且非null,则返回其值;否则,返回word。例,如果count未定义,则${count:-0}返回0。

${varname:=word}
如果varname存在且非null,则返回其值;否则,varname=word。

${varname:?message}
如果varname存在且不是null,则返回它的值;否则,显示varname:message后退出脚本。

${varname:+word}
如果varname存在且非null,则返回word;否则,返回null。例,如果count已定义,则${count:+1}返回1。

ps:上述运算符内的冒号都是可选的。如果去掉则将定义中的存在且非null改为存在,即运算符仅用于测试变量是否存在。

模式匹配运算符

${var#pattern}
如果模式匹配于变量值的开头处,则删除匹配的最短部分,并返回剩下部分。

${var##pattern}
如果模式匹配于变量值的开头处,则删除匹配的最长部分,并返回剩下部分。

${var%pattern}
如果模式匹配于变量值的结尾处,则删除匹配的最短部分,并返回剩下部分。

${var%%pattern}
如果模式匹配于变量值的结尾处,则删除匹配的最长部分,并返回剩下部分。

例:
path=/home/tolstoy/mem/long.file.name
${path#/*/} 结果: tolstoy/mem/long.file.name
${path##/*/} 结果:long.file.name
${path%.*} 结果:/home/tolstoy/mem/long.file
${path%%.*} 结果:/home/tolstoy/mem/long

字符串操作:
${#path} : 返回变量的字符串长度, 为32
${string:position:length},例{path:6:11} : 返回6-11字符串:tolstoy/mem
${string/substring/replacement}
Replace first match of $substring with $replacement
${string//substring/replacement}
Replace all matches of $substring with $replacement

特殊变量: 例
$ set -- hello "hi there" greetings         设置新的位置参数
$ echo there are $# total arguments         显示计数值
there are 3 total arguments
$ for i in $* (or $@)                     $*,$@一次表示所有的命令行参数
  do echo i is $i
  done
i is hello
i is hi
i is there
i is greetings
$ for i in "$@"              "$@"将所有命令行参数视为单个字符串,即"$1 $2"
  do echo i is $i
  done
i is hello
i is hi there
i is greetings
$ shift                                    去除第一个参数
$ echo there are $# total arguments
there are 2 total arguments



if-elif-else-fi基本语法:例
#! /bin/bash

echo "Is it morning? Please answer yes or no."
read YES_OR_NO                   #输入value
if [ "$YES_OR_NO" = "yes" ]; then
  echo "Good morning!"
elif [ "$YES_OR_NO" = "no" ]; then
  echo "Good afternoon!"
else
  echo "Sorry, $YES_OR_NO not recognized. Enter yes or no."
  exit 1
fi
exit 0

ps: "[]"为判断语句,返回1或0。if [pipeline] 等价于 if test pipeline。
因此可在[]中加入test的各种参数。
如:
if [ -f "$file" ] && [ ! -x "$file" ]; then
    echo $file is a file but cannot execute
elif [ -d "$file" ]; then
    echo $file is a directory
fi



case/esac基本语法:    case命令可类比C语言的switch/case语句,esac表示case语句块的结束。C语言的case只能匹配整型或字符型常量表达式,而Shell脚本的case可以匹配字符串和Wildcard,每个匹配分支可以有若干条命令,末尾必须以;;结束,执行时找到第一个匹配的分支并执行相应的命令,然后直接跳到esac之后,不需要像C语言一样用break跳出。
#! /bin/bash

echo "Is it morning? Please answer yes or no."
read YES_OR_NO
case "$YES_OR_NO" in
yes|y|Yes|YES)
  echo "Good Morning!";;
[nN][oO])
  echo "Good Afternoon!";;
*)
  echo "Sorry, $YES_OR_NO not recognized. Enter yes or no."
  exit 1;;
esac



for/in/do/done基本语法:例
#! /bin/bash

for FRUIT (in apple banana pear); do
  echo "I like $FRUIT"
done
ps: 如果未写()中内容,则默认执行 for FRUIT in "$#"



while/do/done基本语法:例
#! /bin/sh

echo "Enter password:"
read TRY
while [ "$TRY" != "secret" ]; do
  echo "Sorry, try again"
  read TRY
done

bash学习笔记(二)—— grep, sed

文本过滤工具grep

传统的 grep 程序, 在没有参数的情况下, 只输出符合 RE 字符串之句子. 常见参数如下:

-v: 逆反模示, 只输出"不含" RE 字符串之句子.
-r: 递归模式, 可同时处理所有层级子目录里的文件.
-q: 静默模式, 不输出任何结果(stderr 除外. 常用以获取 return value, 符合为 true, 否则为 false .)
-i: 忽略大小写.
-w: 整词比对, 类似 \<word\> .
-n: 同时输出行号.
-c: 只输出符合比对的行数.
-l: 只输出符合比对的文件名称.
-o: 只输出符合 RE 的字符串. (gnu 新版独有, 不见得所有版本都支持.)
-E: 切换为 egrep .

* egrep:
为 grep 的扩充版本, 改良了许多传统 grep 不能或不便的操作. 比方说:
- grep 之下不支持 ?+ 这两种 modifier, 但 egrep 则可.
- grep 不支持 a|b 或 (abc|xyz) 这类"或一"比对, 但 egrep 则可.
- grep 在处理 {n,m}, 需用 \{ 与 \} 处理, 但 egrep 则不需.
诸如此类的... 我个人会建议能用 egrep 就不用 grep 啦

grep的一般格式为:
   grep [选项]基本正则表达式[文件]。

    
在grep命令中输入字符串参数时,最好将其用双引号括起来。在调用模式匹配时,应使用单引号。
   例如:"mystring"。这样做有两个原因,一是以防被误解为shell命令,二是可以用来查找多个单词组成的字符串。在调用变量时,也应该使用双引号,诸如:grep "$myvar" file,如果不这样,将没有返回结果。
模式匹配:grep 'ab\{1,5\}' file。这样可以防止grep中使用的专有模式与一些shell命令的特殊方式相混淆。



在文本文件里进行替换
1. Sed简介
sed是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。以下介绍的是Gnu版本的Sed 3.02。

2. 定址
可以通过定址来定位你所希望编辑的行,该地址用数字构成,用逗号分隔的两个行数表示以这两行为起止的行的范围(包括行数表示的那两行)。如1,3表示1,2,3行,美元符号($)表示最后一行。范围可以通过数据,正则表达式或者二者结合的方式确定 。

3. Sed命令
调用sed命令有两种形式:

sed [options] 'command' file(s)

sed [options] -f scriptfile file(s)

<
a\
在当前行后面加入一行文本。

b lable
分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。

c\
用新的文本改变本行的文本。

d
从模板块(Pattern space)位置删除行。

D
删除模板块的第一行。

i\
在当前行上面插入文本。

h
拷贝模板块的内容到内存中的缓冲区。

H
追加模板块的内容到内存中的缓冲区

g
获得内存缓冲区的内容,并替代当前模板块中的文本。

G
获得内存缓冲区的内容,并追加到当前模板块文本的后面。

l
列表不能打印字符的清单。

n
读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。

N
追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。

p
打印模板块的行。

P(大写)
打印模板块的第一行。

q
退出Sed。

r file
从file中读行。

t label
if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。

T label
错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。

w file
写并追加模板块到file末尾。

W file
写并追加模板块的第一行到file末尾。

!
表示后面的命令对所有没有被选定的行发生作用。

s/re/string
用string替换正则表达式re。

=
打印当前行号码。

#
把注释扩展到下一个换行符以前。

以下的是替换标记
g表示行内全面替换。
p表示打印行。
w表示把行写入一个文件。
x表示互换模板块中的文本和缓冲区中的文本。
y表示把一个字符翻译为另外的字符(但是不用于正则表达式)

4. 选项
<
-e command, --expression=command
允许多台编辑。

-h, --help
打印帮助,并显示bug列表的地址。

-n, --quiet, --silent
取消默认输出。

-f, --filer=script-file
引导sed脚本文件名。

-V, --version
打印版本和版权信息。


5. 元字符集
<
^
锚定行的开始 如:/^sed/匹配所有以sed开头的行。

$
锚定行的结束 如:/sed$/匹配所有以sed结尾的行。

.
匹配一个非换行符的字符 如:/s.d/匹配s后接一个任意字符,然后是d。

*
匹配零或多个字符 如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。

[]
匹配一个指定范围内的字符,如/[Ss]ed/匹配sed和Sed。

[^]
匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。

\(..\)
保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。

&
保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。

\<
锚定单词的开始,如:/\

\>
锚定单词的结束,如/love\>/匹配包含以love结尾的单词的行。

x\{m\}
重复字符x,m次,如:/0\{5\}/匹配包含5个o的行。

x\{m,\}
重复字符x,至少m次,如:/o\{5,\}/匹配至少有5个o的行。

x\{m,n\}
重复字符x,至少m次,不多于n次,如:/o\{5,10\}/匹配5--10个o的行。

6. 实例
删除:d命令
$ sed '2d' example-----删除example文件的第二行。
$ sed '2,$d' example-----删除example文件的第二行到末尾所有行。
$ sed '$d' example-----删除example文件的最后一行。
$ sed '/test/'d example-----删除example文件所有包含test的行。
替换:s命令
$ sed 's/test/mytest/g' example-----在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。
$ sed -n 's/^test/mytest/p' example-----(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。
$ sed 's/^192.168.0.1/&localhost/' example-----&符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加 localhost,变成192.168.0.1localhost。
$ sed 's/hello/& chen/' example-----hello rui替换为hello chen rui。&被标记为查找内容hello。
$ sed -n 's/\(love\)able/\1rs/p' example-----love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。
$ sed 's#10#100#g' example-----不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有10替换成100。
选定行的范围:逗号
$ sed -n '/test/,/check/p' example-----所有在模板test和check所确定的范围内的行都被打印。
$ sed -n '5,/^test/p' example-----打印从第五行开始到第一个包含以test开始的行之间的所有行。
$ sed '/test/,/check/s/$/sed test/' example-----对于模板test和west之间的行,每行的末尾用字符串sed test替换。
多点编辑:e命令
$ sed -e '1,5d' -e 's/test/check/' example-----(-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除1至5行,第二条命令用check替换test。命令的执 行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。
$ sed --expression='s/test/check/' --expression='/love/d' example-----一个比-e更好的命令是--expression。它能给sed表达式赋值。
从文件读入:r命令
$ sed '/test/r file' example-----file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面。
写入文件:w命令
$ sed -n '/test/w file' example-----在example中所有包含test的行都被写入file里。

追加命令:a命令
$ sed '/^test/a\\--->this is a example' example<-----'this is a example'被追加到以test开头的行后面,sed要求命令a后面有一个反斜杠。
插入:i命令
$ sed '/test/i\\
new line
-------------------------' example
如果test被匹配,则把反斜杠后面的文本插入到匹配行的前面。
下一个:n命令
$ sed '/test/{ n; s/aa/bb/; }' example-----如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续。
变形:y命令
$ sed '1,10y/abcde/ABCDE/' example-----把1--10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令。
退出:q命令
$ sed '10q' example-----打印完第10行后,退出sed。
保持和获取:h命令和G命令
$ sed -e '/test/h' -e '$G example-----在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将 打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。在这个例子里,匹配test的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保 持缓存区的特殊缓冲区内。第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,且追加到现在已经存在于模式空间中 的行的末尾。在这个例子中就是追加到最后一行。简单来说,任何包含test的行都被复制并追加到该文件的末尾。
保持和互换:h命令和x命令
$ sed -e '/test/h' -e '/check/x' example -----互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换。
7. 脚本
Sed脚本是一个sed的命令清单,启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行。

比如,如果要打印出含有字串”1024”的行,我就可能会用:
cat filename | sed –n ‘/1024/p’sed命令详解!!(要学习shell的 朋友要好好看看)
sed /^$/d filename
可以删除文件中的空行。
sed /^[[:space:]]*$/d filename
可以删除内容为多个空格/tab组成的行。

bash学习笔记(一)——正则表达式

脚本第一行的#!
由于系统拥有好几个shell,因此需要通过一种方式告知UNIX内核应该以哪个shell来执行指定的shell脚本。指定方法是,通过脚本文件中特殊的第一行来设置,如:#!/bin/bash。

重定向
<: 改变标准输入 >: 改变标准输出,如果存在同名文件则覆盖,不存在则创建

tr -d 'a' < tmp1.txt > tmp2.txt, 此命令表示用tmp1作为输入执行tr -d命令并将结果输出到tmp2中。

>>: 作用同>,但其不会覆盖同名文件而是追加。

|:管道连接符,可将不同的命令连接起来。

Shell脚本参数
shell脚本的命令行参数都是由整数命名,当它超过9,就应该用大括号把数字框起来。例:

#!/bin/bash
echo first arg is $1
echo tenth arg is ${10}
如需要调试脚本,可在#!/bin/bash后加上 -x/+x来打开/关闭跟踪功能。


正则表达式
metacharacter:
\
将下一个字符标记为一个特殊字符、或一个原义字符、或一个 后向引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。

^
匹配输入字符串的开始位置。

$
匹配输入字符串的结束位置。

*
匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。 * 等价于{0,}。

+
匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。

?
匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。

[]
匹配括号中的一个字符。例,[abc]表示匹配a,b或c

\(\)
将\(与\)间的模式存储在保留空间。最多可将9个独立的子模式存储在单个模式中。匹配于子模式的文本,可通过转义序列\1至\9被重复使用在相同模式里。例如,\(ab\)\(cd\)*\2\1,表示abcd*cdab。 \(["']\).*\1,表示""和''。

\{n,m\}

区间表达式,匹配在它前面的单个字符重现的次数区间。\{n\}指重现n次;\{n,\}指至少重现n次;\{n,m\}指重现n至m次。n,m的值必须介于0-255。



POSIX 字符类. [:class:]

这是另外一个可选的用于指定匹配字符范围的方法。

*

[:alnum:] 匹配字母和数字.等同于A-Za-z0-9.
*

[:alpha:] 匹配字母. 等同于A-Za-z.
*

[:blank:] 匹配一个空格或是一个制表符(tab).
*

[:cntrl:] 匹配控制字符.
*

[:digit:] 匹配(十进制)数字. 等同于0-9.
*

[:graph:] (可打印的图形字符). 匹配 ASCII 码值的33 - 126之间的字符. 这和下面提到的 [:print:]一样,但是不包括空格字符.
*

[:lower:] 匹配小写字母. 等同于a-z.
*

[:print:] (可打印字符). 匹配 ASCII码值 32 - 126之间的字符. 这和上面提到的一样[:graph:], 但是增多一个空格字符。
*

[:space:] 匹配空白字符 (空格符和水平制表符).
*

[:upper:] 匹配大写字母. 等同于A-Z.
*

[:xdigit:] 匹配十六进制数字. 等同于0-9A-Fa-f.

POSIX字符类一般都要求用[[ ]]引起来, 如: grep [[:digit:]] test.txt

使用GAE翻墙

1. Sign in with your account in appspot.com
2. Install Google App Engine SDK for Python
http://code.google.com/appengine/downloads.html#Google_App_Engine_SDK_for_Python
http://googleappengine.googlecode.com/files/google_appengine_1.4.0.zip
download and extract uncompress google_appengine_1.4.0.zip.
modify PATH variable in ~/.bashrc for GAE.
3. checkout GAppProxy
svn checkout http://gappproxy.googlecode.com/svn/trunk/ gappproxy
4. deploy GAppProxy
modify fetchserver/app.yaml, application:
appcfg.py update fetchserver
login appspot.com, My Applications-> -> Versions, choose the lastest and make default.
5. edit localproxy/proxy.conf
6. testing
localproxy/proxy.py