接上一篇的内容。

1.标准输出与标准错误输出重定向到其他文件(或者/dev/null)

grep "str" file >/dev/null 2>&1
或者
grep "str" file &>/dev/null

2.过滤重复行

sort -u file
其中的-u参数,有点儿类似于uniq,所以以上的命令大致等价于sort file | uniq,不过直接使用sort的-u参数更简洁一点儿
以上这个是排序然后去除重复行,也即最终得到的顺序可能已经不是我们原先的顺序了。而我们有时候需要的是,去除文件中的重复行,同时保持原来的顺序,此时可以使用awk命令进行操作:
awk '!a[$0]++' infile > outfile
该命令的原出处忘记了,此处对原作者表示抱歉。在这儿只是简单解释一下该命令。
awk的基本格式为awk 'pattern {action}',其中action省略时,默认为{print},所以awk '1',相当于awk '1 {print}'.
对于该命令,第一次读一行数据时,a[$0]是为0的,由于有"!",所以!a[$0]为1,也即相当于awk '1',即打印当前行。这之后a[$0]执行++,即之后a[$0]的值应该是1.
如果读取到跟之前的某一行一样的数据,那么a[$0]是1,!a[$0]为0,即awk '0',不打印当前行,即不打印之前已经打印过的行。这也就达到了去重的目的。
值得注意的是,命令当中的自加命令++,应该是放置到后面的,即先执行!,之后再去执行++。
该命令虽短小,但是技巧性十足,赞一个!

3.shell编程中,对于$1,$2,....等位置参数的使用。

如果只使用第二个参数以后的参数,及$2,$3..,以前我曾经写过
shift
echo "$@"
后来才知道更方便的做法是echo "${@:2}"
同样的,我们如果只使用最后一个参数,可以使用 "${@: -1},注意-1前面有一个空格,否则可能导致其识别为

${param:-word}的语法

4.上面谈到了${param:-word}语法,我们可以使用这个来设置参数的默认值,

arg=${1:-"hello"}
那么如果没有给第一个位置参数,arg的值将会为"hello"。关于${}参数展开的详细用法,将会在下一篇中详细记录,由于是自己学习的过程,应该会使用实例解释。

5.数学运算

虽然我用到的不多,但是记得有一次需要用到,还是google到的(迄今bash手册都没看完,当时也没去查),其实有两个方法:
第一种是使用expr,例如:
a=1
a=`expr $a + 1`
或者可以使用a=$(($a+1))
第二种是使用let命令
a=1
let a++
需要注意的是,使用expr时变量是需要加上$来引用的,使用let命令时则不需要。

6.使用bash的展开功能(这儿指大括号扩展)

例如新建多个文件夹时,可以执行
mkdir /path/to/your/dir/{old,new,hello}
该命令在/path/to/your/dir下面同时创建了三个文件夹,分别为old,new,hello

该功能在我们备份时也比较有用,尤其是我比较喜欢在编辑配置文件前,先备份,可以如下备份:
cp /path/to/your/file{,-backup}
该命令将会复制file的一个副本,并使用file-backup来保存。

而且该功能其实也支持嵌套,例如需要同时创建一个项目的目录结构,可以如下创建
mkdir -p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}
创建的目录结构如下:
project
|
| -lib
| |-ext
| -bin
| -src
| -doc
| |-html
| |-info
| |-pdf
| -demo
| |-stat
| |-a

另外多提一点,大括号扩展,同时也包括序列扩展。格式如下:
{x..y[..increment]}
其中x,y可以是字母或者数字等,increment是可选的步进值(省略时默认步进值为1(或-1))。例如:
echo {0..10..2} => 0 2 4 6 8 10
echo {a..f..2} => a c e
echo {10..5} => 10 9 8 7 6 5


7.冒号命令

一个比较特殊的命令,什么都不做。
我一般使用冒号来完成如下两个工作:

1)填充if/while等语句块

if condition
then :
else
do-something
fi

上例中的":",什么都不操作,非常适合编写程序时,一时不作处理留待后期补上的情况(之所以要加上:是因为,如果什么都不写的话,shell会认为语法错误)

2)多行注释

由于shell本身是没有多行注释的,所以我习惯使用:来构造自己的多行注释,构造如下:
开头是一个冒号,之后是一个空格,然后是三个引号(我一般使用单引号) 中间是注释块,最后用三个引号结尾。
例如:
: '''
these are some comments statements
echo "hello" is now do nothing here
'''


OK,今天先到这儿。有时间继续。

更多相关文章

  1. Linux 操作系统挂起、休眠、关机相关命令
  2. Linux 的磁盘格式化、挂载、磁盘检验、df、du、fdisk、free命令
  3. Linux文件权限查看及修改命令chmod
  4. Linux 常用命令之文件和目录
  5. linux文件目录权限和系统基础优化命令
  6. Linux Centos 7 有关防火墙命令
  7. SELinux简介以及一些常用命令
  8. 在linux上安装oracle11G必须在图形界面才能安装吗?纯命令行下,安
  9. Linux基础命令杂记

随机推荐

  1. XML数据读取方式性能比较(一)
  2. 给XML文档添加新 ”records”
  3. XML 增、删、改
  4. vbs类天生xml文件
  5. XML指南——XML 确认
  6. Xml SelectNodes 与 XPath
  7. XML 树结构
  8. XML指南——XML CDATA
  9. FusionCharts 3D双柱状图
  10. 四种XML解析方式详解