锋利的Bash(3):三剑客(初探)

初极狭,才通人。

1
ls | sed "s:^:`pwd`/:" | tr "\n" ":" | grep :

引言

配置hadoop环境时候,需要把hadoop的一些链接库jar包导入CLASSPATH变量,但是挨个写又麻烦又容易出错。所以在网上找到这么一条脚本可以直接输出当前目录下所有文件的绝对路径并且用:分割。
最后一个grep命令是为了显示用的,将分隔符高亮显示。

ls

其实没什么好说的。但是反正也总结了,就写得全一点。

  • -a 显示所有文件及目录 (ls内定将文件名或目录名称开头为”.”的视为隐藏档,不会列出)
  • -l 除文件名称外,亦将文件型态、权限、拥有者、文件大小等资讯详细列出
  • -r 将文件以相反次序显示(原定依英文字母次序)
  • -t 将文件依建立时间之先后次序列出
  • -A 同 -a ,但不列出 “.” (目前目录) 及 “..” (父目录)
  • -F 在列出的文件名称后加一符号;例如可执行档则加 “*”, 目录则加 “/“
  • -R 若目录下有文件,则以下之文件亦皆依序列出

sed

三剑客之一。支持正则表达式。
s应该算是常用命令。注意的是sed的执行模式是每次读入一行到缓存空间进行处理,如果要处理跨行内容或者是多行内容需要额外的处理。

sed “s:^:pwd/:”

解释一下就是s执行sed的替换命令,正常情况是以sed “/regex1/s/regex2/str3”的形式执行sed替换命令,意义是对成功匹配regex1的行中,将regex2替换为str3。由于我们在sed命令中嵌入了pwd命令,而该命令的返回中是包含/的。会和sed命令中的/冲突,因此我们把/替换为:占位符。
该条命令的意思就是把每行的行首加上所在文件夹的绝对路径再加上一个/。

tr命令

tr命令可以对来自标准输入的字符进行替换、压缩和删除。

  • -c或——complerment:取代所有不属于第一字符集的字符;
  • -d或——delete:删除所有属于第一字符集的字符;
  • -s或–squeeze-repeats:把连续重复的字符以单独一个字符表示;
  • -t或–truncate-set1:先删除第一字符集较第二字符集多出的字符。

这里执行的是:

1
tr "\n" ":"

其实就是最简单的把来自标准输入的的换行符替换为:。和sed不同的是tr把来自标准输入的内容视为整体进行处理。还有就是tr支持字符集但是不支持正则表达式。

例如可以用tr "A-Z" "a-z"来完成大写转换为小写。但是仔细考虑一下就会发现这实际上不是正则表达式,以为任何一个大写字母都会被A-Z模式匹配,但是如果需要正则表达式进行大小写的替换就需要分组并回看。比如通过sed实现大小写替换的功能就可以通过sed "s/[A-Z]/\l&/"来实现。其中&是sed的元字符,表示前面匹配到的字符串,\l的意思是把下一个字符转换为大写。

所以tr实际上就是进行单个字符的转换,如果给定的是两个字符集,就会进行一一映射,如果后面的字符集小,那么前面多出来的字符都会映射为字符集2的最后一个字符,如果后面的字符集长,那么多出来的部分不会被用到。

另外再提一下tr的其他几个命令。

-d是进行删除,只需要提供一个字符集,把字符集中的字符全部删除。

-s是对重复的字符进行删除

另外,tr命令也有自己的字符集,例如tr [:lower:] [:upper:]同样可以将小写字母替换为大写命令。

grep

目前我就是把它当做简单的查找命令使用……但是作为三剑客之一应该很强吧。但是这篇文章就先写到这里。如果以后有机会用到,会再写一篇文章说的细致一些。

参考

  1. sed and awd笔记系列:http://kodango.com/sed-and-awk-notes-part-1
  2. 菜鸟教程:http://www.runoob.com/linux/linux-comm-sed.html
  3. ;linux命令大全:http://man.linuxde.net/tr
本站总访问量