linux bash shell常用技巧(2)



接上一篇的内容。

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,今天先到这儿。有时间继续。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值