常用命令汇总:

文本处理:
cat
less
head/tail
sort
vim
wc
grep
cp/mv/rm
awk
sed
diff
echo
printf

文件处理:
ls
ln
tree
tar
du
find
file
ldd
iconv

任务管理:
ctrl + z/c/r/b/f
jobs/fg/bg
source
date
xargs

系统处理:
sudo
chmod
passwd
bashrc/bash_profile
export
netstat

文件传输:
scp
wget
lftp

文本处理相关:

vim

    vim regex 匹配使用group: `s/\(xx\)ad\(xx\)/xx\1\2/g`
    vim 显示隐藏字符:`set list`
    vim 扩大文件之间的copy行数到100 `:set viminfo='100,<100,s10,h`
    vim case casting:
        vim to UPPER CASE gU
        vim to downcase  gu
        vim to opposite case g~
    vim 换行 %s/html:/&\r/g
    vim buffer:
    set noexpa
    shift+3  高亮当前代码
    :g/^$/d   去除空行
    %s/xx/&\r/g 换行
    vim移动窗口位置
      Control + w && shitf + hjkl
      vim 在窗口间移动光标 Control + w && hjkl
    vim 忽略大小写,/simple\c

    vim restore the cursor position:
    " put those line to .vimrc
    au BufReadPost *
        \ if line("'\"") > 0 && line("'\"") <= line("$") && &filetype != "gitcommit" |
            \ execute("normal `\"") |
        \ endif

sed
    sed 's/[\t]//g' test.txt > out.txt
    sed 's/[\x09]//g' test.txt > out.txt
    sed -e 's/^A/xxx/g' file > newFile

iconv
    iconv -f encoding -t encoding inputfile
    iconv -f GBK -t UTF-8 file1 -o file2

grep/awk # TODO

任务管理:

进程前后台操作相关:
    Ctrl + C    # 退出前台命令执行,回到shell
    Ctrl + Z    # 暂停前台命令执行,回到shell
    jobs        # 查看当前在后台执行命令,可查看进程号码
    &           # 运行命令时,在末尾添加&,使得命令在后台执行
    fg N        # 将命令进程号码为N的进程,放到前台执行
    bg N        # 将命令进程号码为N的进程,放到后台执行
    2>&1        # 将标准错误输出 输出到标准输出
    nohup       # 使程序后台执行,并忽略HUP信号(用户注销,网络端口引起)

date
    date -d
    date -d "1 day ago" 
    date -d "1 day ago" +%Y%m%d
    date +%Y%m%d
    date --date='20140902 2 day' +%Y%m%d
    date --date='20140902 2 days ago' +%Y-%m-%d

source
    source demo.sh  # 逐行读取demo.sh并逐行执行,在当前shell环境中
    . demo.sh       # 与source demo.sh等同
    ./demo.sh       # 将demo.sh当做可执行文件,并建立新shell环境来执行

文件处理:

文件压缩解压
    tar -zcvf xx.tgz xx     # 将xx压缩至xx.tgz,xx可以为一批文件
    tar -zxvf xx.tgz        # 解压xx.tgz
    unzip xx.tar.bz2
    bzip2 -d xx.tar.bz2 => xx.tar
    tar -xvf  xx.tar => xx

链接文件
    ln -s path/to/file linkName # 建立指向路径path/to/file的软链
    unlink linkName             # 
    rm linkName
    ln -rf linkName
    Not!!! ln -fr linkName/

文件查找
    find start_path -name file_to_find
    find /home/work -name my.sh
    find . -name "*py" | xargs cat | wc -l
    find . -type d -name ".svn" | xargs rm -fr 
    find . -type f -exec rm -v {} \;
    find . -type f -print -delete
    find . -name "*.md5" -exec md5sum -c {} \;
    find . -name "*.md5" | xargs -i md5sum -c {}

文件传输:
    lftp -u user,pwd host:/path/to/file # 查看带user/pwd的内容
    wget --ftp-user=xxx --ftp-password=xxx ftp://host:/path/to/file # 指明user、passwd
    wget --no-check-certificate ftp://host:/path/to/file # 不验证https安全性
    scp local_file remote_username@remote_ip:remote_folder
    scp -r local_dir remote_username@remote_ip:remote_folder

系统状态:

show machine hardware info
    lscpu
    cat /proc/meminfo       # 空闲内存情况
    cat /etc/redhat-release # 查看centos版本
    cat /etc/issue          # 查看centos版本
    free -h                 # 空闲内存情况


show user login info:
    last    # Show a list of last logged in user
    uptime  # Tell how long system been running

添加用户
    sudo adduser thegeek

Mysql相关:

mysql dump
    mysqldump -u root -ppassword tablename --no-data > tablename.sql
    mysql -u root -ppassword tablename < tablename.sql
    mysql set name gbk

mysql alter table
    alter table aka_audit_output_hour change   ideaid ideaid bigint;
    alter table aka_audit_output_hour change   audit_pipe audit_type string

mysql function
    select count(distinct idvisit) AS counted,
        FROM_UNIXTIME(TRUNCATE(UNIX_TIMESTAMP(server_time)/900.0,0)*900)
        AS sv_time_d
        FROM visits group by server_time_ed
    select lpad(id, 4, '0000') from t1;
    select substring_index("/test/examplepath/use/rlo/g.txtasdf", '/', 3);

shell语言:

目录是否存在
if [ -d "$DIRECTORY" ]; then
  # Control will enter here if $DIRECTORY exists.
fi

shell 获取命令的输出值
count=$(ls | wc -l)

shell 的参数
    $# 参数个数  
    $1 $2 .. $n 第一、第二、第n个参数

'' 与 "" 的区别 

数组
    shell里变量的类型不是特别明确,字符串和变量可以混用,关键是看参与什么运算;
    数组可以用字符串来表示  
    days="1 2 3 4 5"
    for day in days;do
        echo $day;
    done

    ## declare an array variable
    declare -a arr=("element1" "element2" "element3")
    ## now loop through the above array
    for i in "${arr[@]}"do
        echo "$i"
    # or do whatever with individual element of the array
    done

> 和 >>
    >   # write to,清除旧内容
    >>  # write append,不清除旧内容 

sleep
    sleep <nubmer>s/m/h/d   #sleep number秒/分钟/小时/天 

执行一条字符串
    cmd="date +Y%m%d"
    eval $cmd
    val=$(eval $cmd)


printf与echo
    printf会对\n做转义的echo
    echo -e "Hello\nworld"
    echo -e 'Hello\nworld'
    echo Hello$'\n'world
    echo $'hello\nworld'
    printf "hello\nworld\n"

base64 in terminal
    openssl enc -base64 <<< fengkong-hadoop #hadoop的密码居然不能有等号
    openssl enc -base64 <<< fengkonghadoop
    echo `echo xxxx | base64 --decode`

小技巧:

ssh keep alive login
    o@o:~$ cat ~/.ssh/config 
    Host *
    ServerAliveInterval 60
    ControlMaster auto
    ControlPath ~/.ssh/master-%r@%h:%p
    ControlPersist yes

ssh-keygen 
    ssh key生成