常用shell命令总结

Linux常用低端入门命令。

系统监控、审计

  • ssh 远程执行命令,屏蔽连接警告、提示

    1
    ssh  -o StrictHostKeyChecking=no -q 127.0.0.1 "whoami"
  • history命令记录加时间戳

    1
    2
    3
    4
    export HISTTIMEFORMAT="%F %T `whoami` "
    # 或
    echo 'export HISTTIMEFORMAT="%F %T `whoami` "' >> /etc/profile
    source /etc/profile
  • 操作审计

    1
    script -qaf /tmp/audit.log
  • 查看命令执行输出变化

    1
    watch -n1 -d -t "date +%s"
  • 输出命令执行消耗的时间

    1
    2
    3
    4
    5
    6
    7
    # /usr/bin/time -f "time: %E" sleep 10 && echo "OK"
    time: 0:10.00
    OK

    %E real时间,显示格式为[小时:]分钟:秒;
    %U user时间;
    %S sys时间。
  • 编程方式重置用户密码

    1
    echo 密码|passwd --stdin 用户名

输入输出

  • 读取键盘输入

    1
    2
    3
    4
    5
    6
    7
    8
    9
    read
    默认将读取到的数据保存到变量REPLY中
    -p "tips:"输出提示
    -s 密码方式输入,不回显
    -r 允许读取反斜杠
    -t timeout 设置等待超时时间
    -n number 设置读取变量的最大长度,不需回车结束
    -d "@" 定义结束符,默认回车
    -a arrayName 将单词存入数组
  • 终端输出

    1
    2
    stty -echo  禁止将输出发送到终端
    stty echo 允许将输出发送到终端
  • 彩色输出

    1
    2
    3
    4
    5
    6
    7
    8
    echo -e "\033[30m 黑色字 \033[0m"
    echo -e "\033[31m 红色字 \033[0m"
    echo -e "\033[32m 绿色字 \033[0m"
    echo -e "\033[33m 黄色字 \033[0m"
    echo -e "\033[34m 蓝色字 \033[0m"
    echo -e "\033[35m 紫色字 \033[0m"
    echo -e "\033[36m 天蓝字 \033[0m"
    echo -e "\033[37m 白色字 \033[0m"
  • json格式化输出

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    curl -s http://ip.taobao.com/service/getIpInfo.php?ip=8.8.8.8|python -m json.tool
    {
    "code": 0,
    "data": {
    "area": "",
    "area_id": "",
    "city": "",
    "city_id": "",
    "country": "\u7f8e\u56fd",
    "country_id": "US",
    "county": "",
    "county_id": "",
    "ip": "8.8.8.8",
    "isp": "",
    "isp_id": "",
    "region": "",
    "region_id": ""
    }
    }
  • 将Windows格式转换成unix格式,去掉^M

    1
    dos2unix windows.txt
  • 用sed消除空格

    1
    sed s/[[:space:]]//g

文件属性

  • 文件只读属性

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 增加只读属性
    chattr +i filename
    # 删除只读属性
    chattr -i filename
    # 增加追加属性
    chattr +a filename
    # 删除追加属性
    chattr -a filename
    # 查看文件属性
    lsattr filename
  • 输出文件属性

    1
    2
    3
    4
    # 数字格式输出文件或目录的权限值
    stat -c"%a" /tmp
    # 显示某一文件或目录的创建时间
    stat -c"%Z" /tmp
  • 获取软链实际指向的路径

    1
    readlink /usr/local/test/link
  • 显示文件或目录的绝对路径

    1
    ls -1d /data/files/*

文本、文件操作

  • 生成随机字符串显示成三列

    1
    tr -dc 'A-Za-z0-9!@#$%^&*' < /dev/urandom | fold -w 30 | head -n 30|paste - - -
  • 生成随机密码

    1
    2
    3
    4
    5
    # 方式一
    echo `tr -dc 'a-zA-Z0-9' < /dev/urandom | head -c20`
    cat /dev/urandom | tr -dc 'a-zA-Z0-9' | head -c 10
    # 方式二
    tr -dc 'A-Za-z0-9!@#$%^&*' < /dev/urandom | fold -w 20 | head -n 1
  • cut命令方式截取

    1
    2
    3
    4
    cut -c N-M
    eg:
    获取系统版本
    lsb_release -r |awk '{print $2}'|cut -c 1-3
  • 根据已有字符串生成随机临时文件名后缀

    1
    FileName=$(echo $SERV | md5sum | cut -d" " -f1)
  • 日志文件切割

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 按行数切割
    split -l 行数 -d -a 3 文件 文件前缀
    #-d:数字后缀
    #-a length 指定后缀的长度
    eg: split -l 100000 -d -a 4 nginx_access_log /var/log/nginx_access_log_
    # 按文件大小切割
    split -b 大小 文件 文件前缀
    # -b:指定文件大小,单位为byte
    # 默认分隔为字母后缀的文件
  • 多行文本转换成一行(将目录中的子文件或目录一行输出)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # awk方式
    ls -1 /var/log/ |awk 'BEGIN{printf("%s","{")}{printf("%s,",$0);}END{print "}"}'
    # sed方式
    ls -1 /var/log/ |sed ':a;N;s/\n/\t/;t a;'
    # paste方式
    ls -1 /var/log/ |paste -d" " -s
    # tr方式
    ls -1 /var/log/ |tr -s "\n" "\t"
    # xargs方式
    ls -1 /var/log/ |xargs echo
  • 输出重定向副本到文件

    1
    whoami |tee -a /tmp/script.log
  • diff命令常用参数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    -b或--ignore-space-change:不检查空格字符的不同; 
    -B或--ignore-blank-lines:不检查空白行;
    -H或--speed-large-files:比较大文件时,可加快速度;
    -i或--ignore-case:不检查大小写的不同;
    -q或--brief:仅显示有无差异,不显示详细的信息;
    -s或--report-identical-files:若没有发现任何差异,仍然显示信息;
    -T或--initial-tab:在每行前面加上tab字符以便对齐;
    -w或--ignore-all-space:忽略全部的空格字符;
    -y或--side-by-side:以并列的方式显示文件的异同之处;
    --left-column:在使用-y参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容;
    --suppress-common-lines:在使用-y参数时,仅显示不同之处。
  • 文件备份

    1
    2
    3
    4
    mv -bf -S "_$(date "+%Y-%m-%d_%H%M%S")" /tmp/test /tmp/ >/dev/null 2>&1
    -b:需要覆盖时,备份源文件;
    -f:若目标文件或目录存在,则强制覆盖;
    -S<后缀>:为备份文件指定后缀,默认后缀为~,当备份文件或目录已存在时,mv操作报错中止;

网络、端口、进程

  • 释放已删除文件占用的磁盘空间

    1
    lsof |grep delete |awk '{print $2}'|xargs kill -9
  • ping 命令输出结果前加时间戳前缀

    1
    ping 127.0.0.1| awk '{ now=strftime("%Y-%m-%d %H:%M:%S",systime()); printf("%s:%s\n",now,$0);}'
  • 解析与反解析

    1
    2
    3
    dig +short www.lengyuewusheng.com
    # 主要在内网环境中应用
    dig +short -x 10.0.0.1
  • 输出本地启动的服务及端口

    1
    netstat -anltp|awk '{if($NF=="*") {print $4":" $(NF-1)} else {print $4":" $NF}}'|sed 's/\//:/g'|egrep -v ":::|::" |awk -F':' '{if ($2~/^[0-9]*$/) print $2" "$NF}'|sort -u 
  • 统计TCP不同连接状态的连接数

    1
    netstat -n|awk '/^tcp/ {++a[$NF]} END {for (b in a) print b,"\t",a[b]}'
  • 探测端口是否开放

    1
    2
    3
    4
    5
    nc -w1 -s "${SourceIP}" -z "${TargetIP}" "${TargetPort}" >/dev/null 2>&1 &
    # 指定本地IP本地端口
    nc -v -s 10.0.0.1 -p 50000 -w3 -z 10.0.0.2 80
    # 简单模式
    nc -w3 -z 10.0.0.2 80
  • 探测机器活性

    1
    ping -c 1 -w 2 ${TargetIP} >/dev/null 2>&1
  • 关闭80端口的占用程序

    1
    fuser -k -n tcp 80
  • 查看80端口的占用程序

    1
    lsof -i :80
  • 获取网卡的IP地址

    1
    ip addr show dev eth0 | awk '/inet/ {sub(/\//, " "); print $2}'|head -1
  • 端口流量查询

    1
    2
    3
    iftop -i eth1 -n -P
    # 命令安装
    yum -y install http://dl.fedoraproject.org/pub/epel/6/x86_64//iftop-1.0-0.14.pre4.el6.x86_64.rpm
  • 请求网关信息

    1
    2
    3
    4
    5
    6
    7
    8
    # 命令行查询(详细):
    UNIX/Linux:
    #curl cip.cc
    Windows:
    > telnet cip.cc
    > ftp cip.cc
    # 命令行查询纯ip返回:
    UNIX/Linux: #curl ip.cip.cc
  • 防火墙放开http、ssh

    1
    lokkit -s http -s ssh

date 系列

  • 时间日期操作
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    # date -d "@1500000000" "+%d/%b/%Y:%H:%M:%S"
    14/Jul/2017:10:40:00

    # date -d "@1500000000" "+%Y-%m-%d %H:%M:%S"
    2017-07-14 10:40:00

    # date -d "2017-07-14 10:40:00" "+%s"
    1500000000

    # date -d "1 hours ago" "+%Y-%m-%d %H:%M:%S"
    2017-08-15 08:59:59

    # date "+%Y-%m-%d %H:%M:%S %N"
    2017-10-04 15:43:15 911203100

    for i in {001..100} ##for i in $(seq -w 0 100)
    do
    echo -e "$i\t $(date "+%Y-%m-%d %H:%M:%S.%N")"
    done

find 系列

  • find 相关操作
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    # 针对find查询到的结果进行多步操作
    find . -name "*.cfg" -exec echo -e "=============\n{}" \; -exec ls -1 {} \;

    # find 排除多个目录
    find /data/ \( -path /data/test1 -o -path /data/test2 -o -path /data/test3 \) -prune -o -type f -name "fileName" -exec echo -e "=============\n{}" \; -exec dirname {} \;
    固定格式: \( -path /path1 -o -path /path2 \) -prune -o

    # 对find查询结果执行多步操作
    find /data/ \( -path /data/test1 -o -path /data/test2 -o -path /data/test3 \) -prune -o -type f -name "fileName" -print |xargs -P3 -n1 -I {} sh -c '[ -L {} ] && echo -e {}"is a Soft link." || echo -e "{} is a File."'
    xargs后通过sh -c ''执行多次命令
    -P num 开启num个进程加速处理

    # find统计/var/log目录下每一个文件的记录行数
    find /var/log/ -type f -name "*.log" -print0 | xargs -0 wc -l
    # -print0:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为全部的名称皆在同一行
    # xargs -0将\0作为定界符

    # 最近7天日志文件的总大小
    find /var/log/ -mtime -7 -type f | xargs du -ch | tail -n1

    # 对文件批量重命名
    find /data/ -type f -name "*keywords*" |xargs -t -i mv {} {}.bak$(date "+%Y%m%d")

shell语法

  • 变量赋值

    1
    2
    3
    4
    ${VAR:-string}  如果VAR变量为空则返回string
    ${VAR:+string} 如果VAR变量不为空则返回string
    ${VAR:=string} 如果VAR变量为空则重新赋值VAR变量值为string
    ${VAR:?string} 如果VAR变量为空则将"string"作为报错信息输出到stderr
  • 字符串截取及替换

符号 意义
${var#*”分隔符”} #*”分隔符” 表示删除从左往右第一个分隔符以及其左边的所有字符
${var##*”分隔符”} ##*”分隔符” 表示删除从左往右最后一个分隔符以及其左边的所有字符
${var%”分隔符”*} %”分隔符”* 表示删除从右往左第一个分隔符以及其右边的所有字符
${var%%”分隔符”*} %%”分隔符”* 表示删除从右往左最后一个分隔符以及其右边的所有字符
${var:n:m} 从左边第n个字符开始,往右截取m个字符
${var:n} 从左边第n个字符开始,往右截取到最后
${var:0-n:m} 从右边第n个字符开始,往右截取m个字符
${var:0-n} 从右边第n个字符开始,往右截取到最后
${var/ABC/abc} 将${var}中第一个ABC用abc替换ABC
${var//ABC/abc} 将${var}中所有的ABC用abc替换ABC
${var/#ABC/abc} 如果字符串${var}以ABC开头则用abc替换ABC
${var/%ABC/abc} 如果字符串${var}以ABC结尾则用abc替换ABC
${var#start} 如果字符串${var}以start开头,则删掉
${var%end} 如果字符串${var}以end结束,则删掉
${var#s} 如果字符串${var}开头第一个字母是s则删掉
${var%e} 如果字符串${var}最后一个字母是e则删掉
$- 当前设置的shell选项
${-#*i} 删除shell选项中i以及其左边的所有字符,常用于判断是否是交互式shell
  • $- shell选项参数说明
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $- prints The current set of options in your current shell.

    himBH means following options are enabled:

    H - histexpand
    m - monitor
    h - hashall
    B - braceexpand
    i - interactive

eg:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var=http://test.com/index.html_http://test.com/default.html

${var#*//}: test.com/index.html_http://test.com/default.html
${var##*/}: default.html
${var%/*}: http://test.com/index.html_http://test.com
${var%%/*}: http:
${var:0:3}: htt
${var:5}: //test.com/index.html_http://test.com/default.html
${var:0-10:3}: fau
${var:0-10}: fault.html
${var/http/https}: https://test.com/index.html_http://test.com/default.html
${var//http/https}: https://test.com/index.html_https://test.com/default.html
${var/#http/https}: https://test.com/index.html_http://test.com/default.html
${var/%html/php}: http://test.com/index.html_http://test.com/default.php

var="starrend"
${var#start}: end
${var%end}: start
  • 变量的间接引用

    1
    2
    3
    var1="It's a magical way"
    var2="var1"
    echo "${!var2}"
  • shell中的括号

符号 意义
() 1.定义数组变量;2.命令组,括号中的变量不能被括号外引用
$() 和反引号(``)相同,都是用来做命令替换
$(()) 和$[]相同,都是进行数学计算,bash中只能进行整数运算,浮点数作为字符串处理
[] 1.test的另一种形式;2.字符范围
$[] 和$(())相同,都是进行数学计算
[[]] bash中的关键字,不是命令,用于if判断结构
{} 代码块,又称内部组。与小括号不同,大括号内的命令不会新开一个子shell运行,括号内变量可以被括号外引用。分号隔开命令,最后一条命令也必须跟分号。
${} 变量引用
  • 判断字符串包含

    1
    2
    3
    4
    5
    6
    7
    8
    long_str=abcded
    short_str=def
    if [[ "${long_str}" =~ "${short_str}" ]]; then
    echo "包含"
    else
    echo "不包含"
    fi
    =~ 判断前者是否包含后者
  • 数组操作

    1
    2
    3
    4
    5
    数组定义:arrayName=("elements_1" "elements_2" "elements_3")
    数组单个元素赋值:arrayName[$i]="value"
    数组长度:${#arrayName[@]}
    取数组所有元素:${arrayName[@]}
    数组中的单个元素:${arrayName[$i]}

其它命令

  • 时间同步

    1
    2
    3
    4
    # 硬件时间与系统时间同步
    /sbin/clock -w
    # 本地时间与时间服务器同步
    /usr/sbin/ntpdate ntp.server
  • 查看单个进程的top信息

    1
    top -p $(pidof ${ProcessName}|sed 's/ /,/g')
  • ab压测

    1
    ab -c 100 -n 10000 "http://127.0.0.1/"
  • 系统盘iNode使用率过高,一般的清理策略

    1
    find /var/spool/postfix/maildrop/ -type f -delete
  • top后台记录系统启动的进程信息

    1
    2
    3
    4
    5
    top -bc -n 3 -d 5
    -b: 批处理模式
    -c: 显示完整命令
    -d: 设置延迟间隔
    -n: 设置输出次数
  • 编码转换

    1
    iconv -f GBK -t UTF-8 gbk.txt -o utf8.txt

硬件相关

  • 虚机硬盘坏盘修复
    1
    2
    3
    4
    5
    6
    确定文件系统类型:
    df -T

    修复:
    umount /dev/vdb
    xfs_repair /dev/vdb
    • xfs_repair: xfsprogs.x86_64

字符ASCII互转

  • ASCII转字符

    1
    2
    3
    4
    5
    将十进制ascii转字符
    printf \\x`printf %x 97`
    将16进制ascii转字符
    printf \\x61
    echo -e "\x41"
  • 字符转ASCII

    1
    2
    printf "%d" "'A"
    echo -n "A"| od -An -t dC