VIM
  • shell 脚本中,使用vim打开文件
    非编辑模式下,光标放在数字上,使用 Ctrl+a 组合,可以使数字+1
  • 可以用 :N 或者 NG 来使光标定位到第N行
  • vim中移动第10~15 行的内容到第2行下:10G 5dd 2G p
  • vim 中光标移到一行的末尾: $
  • vim 中删除一行中光标后面的内容:d+$
shell 操作类

1.快速移动光标

  • 在shell命令行中:
    Ctrl+a 可以使光标移到最前面
    Ctrl+e 可以使光标移到最后面
    同样在hive客户端也适用
    shell 脚本小技巧【持续更新中】_vim

2.删除N天前的日志文件

命令: find . -mtime +N -type f -name "*.log.*" -exec rm -f {} \;

简单解释: find . 查询
-mtime 规定时间的一个参数,固定格式;
+N : N是指N天前;
-type f :类型文件;
-name: 名称;
.log.” :要删除的文件的后缀名称,如果是删除全部,可以写"*";
-exec rm -f {} \ :固定格式,递归删除前面条件约束下的文件;

3.chown 修改文件权限

修改文件权限,如果用户及用户组相同可以使用

chown username. file.txt

4.检查脚本中是否有语法错误

bash -n xxx.sh

如:
shell 脚本小技巧【持续更新中】_其他_02

5.一串的命令执行()和{}的区别

-(){}都是对一串的命令进行执行,但有所区别:

相同点:
()和{}都是把一串的命令放在括号里面,并且命令之间用;号隔开
不同点
()只是对一串命令重新开一个子shell进行执行,{}对一串命令在当前shell执行
()最后一个命令可以不用分号,{}最后一个命令要用分号
()里的第一个命令和左边括号不必有空格,{}的第一个命令和左括号之间必须要有一个空格
()和{}中括号里面的某个命令的重定向只影响该命令,但括号外的重定向则影响到括号里的所有命令

测试():
shell 脚本小技巧【持续更新中】_字符串_03
测试{}:
shell 脚本小技巧【持续更新中】_vim_04

shell脚本传参

1.可以用${@:3}把第3个参数及后面的参数当做一个参数

$ cat test.sh 
echo $@
echo $*
echo $1
echo $2
echo ${@:3}

这个应用场景主要是javascript:void(0)

2.shell 中的shift用法

对于位置变量或命令行参数,其个数必须是确定的,或者当 Shell 程序不知道其个数时,可以把所有参数一起赋值给变量$*。
若用户要求 Shell 在不知道位置变量个数的情况下,还能逐个的把参数一一处理,也就是在 $1 后为 $2,在 $2 后面为 $3 等。在 shift 命令执行前变量 $1 的值在 shift 命令执行后就不可用了。
例如:

$ cat x_shift2.sh
if [ $# -eq 0 ]
then
echo "Usage:x_shift2.sh 参数"
exit 1
fi
sum=0
until [ $# -eq 0 ]
do
sum=`expr $sum + $1`
shift
done
echo "sum is: $sum"

执行上述程序:

sh ./x_shift2.sh 10 20 15

其显示结果为:
45

字符串

1.grep正则匹配字符串

用法: grep [选项]... PATTERN [FILE]...
-E, --extended-regexp     PATTERN 是一个可扩展的正则表达式(缩写为 ERE)
-P, --perl-regexp         PATTERN 是一个 Perl 正则表达式
-o, --only-matching       show only the part of a line matching PATTERN

一般用Perl 正则表达式处理起来比较方便:

$ cat test.txt | grep -Po "comment=.*?,"
comment=xxxxxx,
时间类 批量修改文件名

下面的脚本稍微改以下就可以改为递归的:

#!/bin/bash
dst_path=$1
for file in `ls $dst_path`
do
        if [ -d $1/$file ]
                 then echo `$0 $1/$file`
        elif [ -f $1/$file ]
                then    mv $1/$file $1/${file}._mod
        else
            echo $1/${file} is unknow file type
        fi

done;