常用shell命令总结
Linux常用低端入门命令。
系统监控、审计
ssh 远程执行命令,屏蔽连接警告、提示
1
ssh -o StrictHostKeyChecking=no -q 127.0.0.1 "whoami"
history命令记录加时间戳
1
2
3
4export 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
9read
默认将读取到的数据保存到变量REPLY中
-p "tips:"输出提示
-s 密码方式输入,不回显
-r 允许读取反斜杠
-t timeout 设置等待超时时间
-n number 设置读取变量的最大长度,不需回车结束
-d "@" 定义结束符,默认回车
-a arrayName 将单词存入数组终端输出
1
2stty -echo 禁止将输出发送到终端
stty echo 允许将输出发送到终端彩色输出
1
2
3
4
5
6
7
8echo -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
19curl -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 1cut命令方式截取
1
2
3
4cut -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
4mv -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
3dig +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
5nc -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
3iftop -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 | var=http://test.com/index.html_http://test.com/default.html |
变量的间接引用
1
2
3var1="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
8long_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
5top -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
2printf "%d" "'A"
echo -n "A"| od -An -t dC