天天看点

实用bash命令记录

本篇文章记录工作中比较实用,能减轻工作量的bash命令。

假设有这么一个变量silo=/home/liujiacai/codes/cascalog/silo,那么

##表示取后面字符串最长的那段;#表示取最短的那段,这两个是从前面删除的

%%和##功能相同,不过这个是从后面开始删的。第一个什么也没删除是因为silo最后一个字符为‘o’不是‘/’,所以不变

 bash shell可以进行变量的条件替换,既只有某种条件发生时才进行替换

 ${foo:-word}  

当没有foo变量时,返回word

${foo:=word}

当没有foo变量时,返回word,并且把word赋值给foo变量

 ${foo:+word}  

当定义了foo变量时,返回word

${foo:?msg}

当没有foo变量时,把msg送到标准错误输出

${foo:offset:length} 

length可以为空

${#foo}

变量foo字符个数

 ${foo/pattern/string}

字符串替换,最短原则

 ${foo//pattern/string}

字符串替换,最长原则

如果foo=aabbbbbbbcc,那么

echo ${foo//bb/dd}返回aaddddddbcc

echo ${foo//bb/dd}返回aaddbbbbbcc

以前在做java开发时也无数次遇到re(regex expression),每次看我都以为我懂了,直到今天我才算是明白,我掌握的知识永远是那么冰山一角。扯蛋完毕。

warning:正则表达式和通配符(wildcard)不一样。

正则表达式分基本re与扩展re之分,bash中有个命令默认只认识基本的,比如grep,但是通过-e参数就能识别扩展的了;有的可以认识扩展,这点一定要搞清楚。

在基本表达式中有这么几个特殊字符,一定要记住

基本正则表达式的特殊字符

re字符

含义与范例

^word

待搜索的字符串(word)必须在行首

word$

待搜索的字符串(word)必须在行尾

.

代表任意一个字符

\

转移符,将有特殊符号的特殊意义去掉

*

重复前一个字符,一次或多次。warn:这里和通配符中*含义不同

\{n,m\}

连续n到m个的“前一个重复字符”

[word]

[]内的字符集合中任取一个字符 h[io]t  代表的是hit或者hot;其次是[0-9]、[a-z]等这种用法; 再其次是[^word],表示不含“w”、“o”、“r”、“d”中的字符

再说说扩展re的特殊字符

扩展正则表达式的特殊字符

+

重复前一个字符一次或一次以上,比如go+d,,可以表示god、good、goood等等

重复前一个字符零次或一次,比如go?d,表示gd、god

|

表示或的意思,比如'gd|good',表示取gd或者good

()

分组处理字符,比如'g(la|oo)d',可以表示glad或者good

再提醒一次,“!”叹号在正则表达式中并不是特殊字符。

unix-like系统还存在一类字符串匹配机制--globbing,在globbing中,*和通配符的用法是一样的,代表零个或多个任意字符。git的.gitignore文件就是使用的这种字符串匹配模式

find path [-name] pattern  在path路径下查找名字为pattern的文件,返回基于path的相对路径

这条命令查找当前目录下的文件,并且作为file命令的参数执行。{}表示当前文件名,用单引号是防止{}被shell解释器解释为shell script punctuation,分号用反斜线也是这样目的,也可以用单引号代替反斜线。

查找$home文件夹下在24小时之内修改过的文件。这里用0是因为-mtime选项对于每个文件的修改时间取其除以24后的商,余数舍弃。

这个命令是用来查看项目的是否有.svn与.git与cvs目录的,-o 是-or的简写,表示前面的命令为false时才执行,{}表示当前处理的文件夹名,-prune选项可以防止不必要的嵌套查找,假设repo有如下目录结构:

repo/project1/cvs

repo/gnu/project2/.svn

repo/gnu/project3/.svn

repo/gnu/project3/src/.svn

repo/project4/.git

带上-prune选项后就不会再搜索project3/.src目录了,因为已经找到了project3/.svn了。

这个命令在管道中特别有用

这条命令查找/tmp文件夹下名为core的文件,并且把它删除。这时的文件名中不能有空格、换行符,解决方法是加上 -0参数。

当然上面这条命令还可以这么写:

利用find的参数-delete选项,这样比用xargs效率更高,因为这样不用再调用 fork(2) and exec(2) 来launch rm和xargs进程。

这里的-depth选项指明“先处理文件夹中的内容在处理文件夹本身”,-delete本身就暗含了-depth选项。

这条命令用于显示passwd文件中记录的当前系统的用户。

需要注意的时,xargs并不能一定保证,命令正确执行,有可能xargs后面的命令在接受管道前面的输入时,系统执行其他命令,改变了xargs的输入。

bash中有个test命令可以进行一系列的测试,man 一下可以看到解释为" check file types and compare values",具体语法为

其实我们最常用的是test的一个别名"[",没错,就是左方括号,语法为

expression后面的右方括号是作为结束只用,没什么实际含义.

如果忽略expression,那么返回false. 常用的expression有如下这么几个:

test的这些express和我们平常用的c/java语言系列的判断不一样(比如需要对一些字符进行转义),这点让我们很不是适应,不过幸好,bash提供了补救方案,那就是"[[",使用"[["可以对文件名和字符串使用更自然的语法。可以用括号和逻辑操作符把 test 命令支持的测试组合起来。下面给出一个示例:

使用 [[ 复合命令,这里不再需要对"("与")"进行转义

参考:

http://www.ibm.com/developerworks/cn/linux/l-bash-test.html