枫叶飞翔 发表于 2018-8-20 06:38:40

Shell 常用命令与工具

  防伪码:七月七日晴,忽然下起了大雪。
  本章节学习一些在编写 Shell 时的常用命令或工具,有人说学习好 Shell,首先把 Linux 上各种常
  见的命令和工具掌握了,这句话说的没错,由于 Shell 本身语言在数据结构功能有限,而且 Shell
  本身又工作在 Linux 内核之上,故此调用 Linux 上的命令会很方面,所以大多数情况下我们都是依
  靠这些命令来完成脚本中的数据处理,通过 Shell 语法结构组织代码逻辑。不管是学 Linux 好还是
  Shell 脚本也好,这些命令都是必须要会的,这些命令多之又多,刚开始一定要先把一些常用的学
  会了,以后再用到其他的再学习也不迟,下面是我根据自身经验总结的一些。
  怎么更好的学习命令呢?
  当然查看官方帮助文档了,可以通过 man cmd、cmd --help、help cmd、info cmd 等查看命令的使
  用。
  11.1 ls
  功能:列出目录内容
  常用选项:
  -a 显示所有文件,包括隐藏的
  -l 长格式列出信息
  -i 显示文件 inode 号
  -t 按修改时间排序
  -r 按修改时间倒序排序
  示例:
  按修改时间排序:
  # ls -t
  按修改时间倒序排序:
  # ls -rt
  长格式列出:
  # ls -l
  查看文件 inode:
  # ls -i file
  11.2echo
  功能:打印一行
  常用选项:
  -n 不加换行符
  -e 解释转义符
  示例:
  解释换行符:
  # echo -e "1\n2\n3"
  1
  2
  3
  11.3printf
  功能:格式化打印数据。默认打印字符串不换行。
  格式:printf format
  常用选项:
  format:
  %.ns 输出字符串,n 是输出几个字符
  %ni 输出整数,n 是输出几个数字
  %m.nf 输出浮点数,m 是输出的整数位数,n 是输出的小数位数
  %x 不带正负号的十六进制值,使用 a 至 f 表示 10 至 15
  %X 不带正负号的十六进制,使用 A 至 F 表示 10 至 15
  %% 输出单个%
  一些常用的空白符:
  \n 换行
  \r 回车
  \t 水平制表符
  对齐方式:
  %-5s 对参数每个字段左对齐,宽度为 5
  %-4.2f 左对齐,宽度为 4,保留两位小数
  不加横线"-"表示右对齐。
  示例:
  输出一个字符:
  # printf "%.1s" abc
  a
  保留一个小数点:
  # printf "%.1f" 1.333
  1.3
  输出换行:
  # printf "%.1f\n" 1.333
  1.3
  格式化输出:
  # printf "user: %s\tpass: %d\n" abc 123
  user: abc pass: 1
  左对齐宽度 10:

  # printf "%-10s %-10s %-10s\n">  ID Name Number
  右对齐宽度 10:

  # printf "%10s %10s %10s\n">  ID Name Number
  每段对齐:

  # printf "%10s\n">  ID
  Name
  Number

  # printf "%-10s\n">  ID
  Name
  Number
  11.4cat
  功能:连接文件和标准输出打印
  常用选项:
  -A 查看所有内容
  -b 显示非空行行号
  -n 显示所有行行号
  -T 显示 tab,用^I 表示
  -E 显示以$结尾
  示例:
  连接两个文件:
  # cat a b
  # cat123
  > abc
  > EOF
  123
  abc
  将 eof 标准输入作为 cat 标准输出再写到 a.txt:
  # cat > a.txt123
  > abc
  > eof
  11.5tac
  功能:连接文件和倒序打印文件
  常用选项:
  示例:
  倒序打印每一行:
  # tac a.txt
  11.6 rev
  功能:反向打印文件的每一行
  常用选项:
  示例:
  # echo "123" |rev
  321
  11.7wc
  功能:统计文件行数、字节、字符数
  常用选项:
  -c 打印文件字节数
  -m 打印文件字符数
  -l 打印多少行
  示例:
  统计文件多少行:
  wc -l a.txt
  11.8cp
  功能:复制文件或目录
  常用选项:
  -a 归档
  -b 目标文件存在创建备份,备份文件是文件名跟~
  -f 强制复制文件或目录
  -r 递归复制目录
  -p 保留原有文件或目录属性
  -i 覆盖文件之前先询问用户
  -u 当源文件比目的文件修改时间新时才复制
  -v 显示复制信息
  示例:
  复制目录:
  # cp -rf test /opt
  11.9mkdir
  功能:创建目录
  常用选项:
  -p 递归创建目录
  -v 显示创建过程
  示例:
  创建多级目录:
  # mkdir /opt/test/abc
  创建多个目录:
  # mkdir {install,tmp}
  创建连续目录:
  # mkdir {a..c}
  11.10mv
  功能:移动文件或重命名
  常用选项:
  -b 目标文件存在创建备份,备份文件是文件名跟~
  -u 当源文件比目的文件修改时间新时才移动
  -v 显示移动信息
  示例:
  移动文件:
  # mv a.txt /opt
  重命名文件:
  # mv a.txt b.txt
  1 1 1.11 rename
  功能:重命名文件,支持通配符
  常用选项:
  示例:批量命名文件
  将 foo1-foo9 替换为 foo01-foo09:
  # rename foo foo0 foo?
  将以.htm 后缀的文件替换为.html:
  # rename .htm .html *.htm
  11.12dirname
  功能:去除路径的最后一个名字
  常用选项:
  示例:
  # dirname /usr/bin/
  /usr
  # dirname dir1/str
  dir1
  dir2
  # dirname stdio.h
  .
  11.13basename
  功能:打印路径的最后一个名字
  常用选项:
  -a 支持多个参数
  -s 删除后面的后缀
  示例:
  # basename /usr/bin/sort
  sort
  # basename include/stdio.h .h
  stdio
  # basename -s .h include/stdio.h
  stdio
  # basename -a any/str1 any/str2
  str1
  str2
  11.14du
  功能:估算文件磁盘空间使用
  常用选项:
  -b 单位 bytes 显示
  -c 产生一个总大小
  -h 易读格式显示(K,M,G)
  -k 单位 KB 显示
  -m 单位 MB 显示
  -s 只显示总大小
  --max-depth=,超过层数的目录忽略
  --exclude=file 排除文件或目录
  --time 显示大小和创建时间
  示例:
  查看目录大小:
  # du -sh /opt
  排除目录某个文件:
  # du -sh --exclude=test /opt
  11.15cut
  功能:选取文件的每一行数据
  常用选项:
  -b 选中第几个字符、
  -c 选中多少个字符
  -d 指定分隔符,默认是空格
  -f 指定显示选中字段
  示例:
  打印 b 字符:
  # echo "abc" |cut -b "2"
  b
  截取 abc 字符:
  # echo "abcdef" |cut -c 1-3
  abc
  已冒号分隔,显示第二个字段:
  # echo "a:b:c" |cut -d: -f2
  b
  11 .16tr
  功能:替换或删除字符
  格式:Usage: tr ... SET1
  常用选项:
  -c 替换 SET1 没有 SET2 的字符
  -d 删除 SET1 中字符
  -s 压缩 SET1 中重复的字符
  -t 将 SET1 用 SET2 转换,默认
  示例:
  替换 SET1 没有 SET2 的字符:
  # echo -n "aaabbbccc" | tr -c c 1
  111111ccc
  去重字符:
  # echo aaacccddd | tr -s ''
  acd
  删除字符:
  # echo aaabbbccc | tr -d bbb
  aaaccc
  替换字符:
  # echo aaabbbccc | tr '' ''
  AAABBBCCC
  删除换行符:
  # echo -e "a\nb\nc" | tr -d '\n'
  abc
  11.17stat
  功能:显示文件或文件系统状态
  常用选项:
  -Z 显示 selinux 安全上下文
  -f 显示文件系统状态
  -c 指定格式输出内容
  -t 以简洁的形式打印
  示例:
  显示文件信息:
  # stat file
  只显示文件修改时间:
  # stat -c %y file
  11.18seq
  功能:打印序列化数字
  常用选项:
  -f 使用 printf 样式格式
  -s 指定分隔符,默认换行符\n
  -w 等宽,用 0 填充
  示例:
  数字序列:
  # seq 3
  1
  2
  3
  带 0 的数字序列:
  # seq -w 03
  01
  02
  03
  范围数字序列:
  # seq 2 5
  2
  3
  4
  5
  步长序列:
  # seq 1 2 5 # 2 是步长
  1
  3
  5
  以冒号分隔序列:
  # seq -s "+" 5
  1+2+3+4+5
  等宽并在数字前面加字符串:
  # seq -f "str%02g" 3 # %g 是默认数字位数,02 是数字不足 2 位时用 0 填充。
  str01
  str02
  str03
  11.19shuf
  功能:生成随机序列
  常用选项:
  -i 输出数字范围
  -o 结果写入文件
  示例:
  输出范围随机数:
  # seq 5 |shuf
  2
  1
  5
  4
  3
  # shuf -i 1-5
  8
  10
  7
  9
  6
  5
  11.20 sort
  功能:排序文本
  常用选项:
  -f 忽略大小写
  -g 一般数字排序
  -M 根据月份比较排序,比如 JAN、DEC
  -h 易读的大小单位排序,比如 2K、1G
  -n 数字比较排序
  -r 倒序排序
  -k n,m 根据关键字排序,从第 n 字段开始,m 字段结束
  -o 将结果写入文件
  -t 指定分隔符
  -u 去重重复行
  默认是对整列排序。
  示例:
  随机数字排序:
  # seq 5 |shuf |sort
  随机字母排序:
  # printf "%c\n" {a..f} |shuf |sort
  倒序排序:
  # seq 5 |shuf |sort -r
  分隔后的字段排序:
  # cat /etc/passwd |sort -t : -k 3 -n
  去重重复行:
  # echo -e "1\n1\n2\n3\n3" |sort -u
  大小单位排序:
  # du -h |sort -k 1 -h -r
  分隔后第一个字段的第二个字符排序:
  # echo -e "fa:1\neb:2\ncc:3" |sort -t : -k 1.2
  tab 作为分隔符:
  # sort -t $"\t"
  file 文件内容:
  zhangsan 6 100
  lisi 8 80
  wangwu 7 90
  zhaoliu 9 70
  对 file 文件的第二列正序排序,再次基础再对第三列倒序排序(多列排序):
  # sort -k 2,2 -n -k 3,3 -nr file
  zhaoliu 9 70
  lisi 8 80
  wangwu 7 90
  zhangsan 6 100
  对两个文件同时排序:
  # sort file1 file2
  11.21uniq
  功能:去除重复行
  常用选项:
  -c 打印出现的次数,只能统计相邻的
  -d 只打印重复行
  -u 只打印不重复行
  -D 只打印重复行,并且把所有重复行打印出来
  -f n 忽略第 n 个字段
  -i 忽略大小写
  -s n 忽略前 N 个字符
  -w 比较不超过前 N 个字符
  示例:
  测试文本如下:
  # cat file
  abc
  cde
  xyz
  cde
  xyz
  abd
  去重复行:
  # sort file |uniq
  abc
  abd
  cde
  xyz
  打印每行重复次数:
  # sort file |uniq -c
  1 abc
  1 abd
  2 cde
  2 xyz
  打印不重复行:
  # sort file |uniq -u
  abc
  abd
  打印重复行:
  # sort file |uniq -d
  cde
  xyz
  打印重复行并统计出现次数:
  # sort file |uniq -d -c
  2 cde
  2 xyz
  根据前几个字符去重:
  # sort file |uniq -w 2
  abc
  cde
  xyz
  11.22tee
  功能:从标准输入读取写到标准输出和文件
  常用选项:
  -a 追加到文件
  示例:
  打印并追加到文件:
  # echo 123 |tee -a a.log
  11.23 join
  功能:连接两个文件
  常用选项:
  -a除显示原来输出的内容外,还显示指定文件中没有相同的栏位,默认不显示
  -i 忽略大小写
  -o 按照指定文件栏位显示
  -t 使用字符作为输入和输出字段分隔符
  -1 连接文件 1 的指定栏位
  -2 连接文件 2 的指定栏位
  示例:
  将两个文件相同字段合并一行,其余不输出:
  # join file1 file2
  打印 file1 第一个列,第 file2 第二列:
  # join -o 1.1 2.2 file1 file2
  同时打印 file1 没有的相同字段:
  # join -a1 file1 file2
  11.24paste
  功能:合并文件
  常用选项:
  -d 指定分隔符,默认是 tab 键
  -s 将文件内容平行,tab 键分隔
  示例:
  两个文件合并,以 tab 键分隔:
  # paste a.txt b.txt
  两个文件合并,+号分隔:
  # paste a.txt b.txt -s -d "+"
  文件内容平行显示,tab 键分隔:
  # paste -s a.txt
  11.25head
  功能:输出文件的前几行
  常用选项:
  -c 打印前多少 K、bytes
  -n 打印前多少行
  示例:
  打印文件前 50 行:
  # head -n 50 file
  11.26 tail
  功能:输出文件的后几行
  常用选项:
  -c 打印前多少 K、bytes
  -f 实时读文件,随着文件输出附加输出
  -n 输出最后几行
  --pid 与-f 一起使用,表示 pid 死掉后结束
  -s 与-f 一起使用,表示休眠多少秒输出
  示例:
  打印文件后 50 行:
  # tail -n 50 file
  实时输出新增行:
  # tail –f file
  11.27find
  功能:搜索文件目录层次结构
  格式:find path -option actions
  常用选项:
  -name 文件名,支持(‘*’, ‘?’, and ‘[]’)
  -type 文件类型,d 目录,f 常规文件等
  -perm 符合权限的文件,比如 755
  -atime -/+n 在 n 天以内/过去 n 天被访问过
  -ctime -/+n 在 n 天以内/过去 n 天被修改过
  -amin -/+n 在 n 天以内/过去 n 分钟被访问过
  -cmin -/+n 在 n 天以内/过去 n 分钟被修改过
  -size -/+n 文件大小小于/大于,b、k、M、G
  -maxdepth levels 目录层次显示的最大深度
  -regex pattern 文件名匹配正则表达式模式
  -inum 通过 inode 编号查找文件
  动作:
  -detele 删除文件
  -exec command {} \; 执行命令,花括号代表当前文件
  -ls 列出当前文件,ls -dils 格式
  -print 完整的文件名并添加一个回车换行符
  -print0 打印完整的文件名并不添加一个回车换行符
  -printf format 打印格式
  示例:
  查找文件名:
  # find / -name "*http*"
  查找文件名并且文件类型:
  # find /tmp -name core -type f -print
  查找文件名并且文件类型删除:
  # find /tmp -depth -name core -type f -delete
  查找当前目录常规文件并查看文件类型:
  # find . -type f -exec file '{}' \;
  查找文件权限是 664:
  # find . -perm 664
  查找大于 1024k 的文件:
  # find . -size -1024k
  查找 3 天内修改的文件:
  # find /bin -ctime -3
  排除多个类型的文件:
  # find . ! -name "*.sql" ! -name "*.txt"
  或条件查找多个类型的文件:
  # find . -name '*.sh' -o -name '*.bak'
  # find . -regex ".*\.sh|.*\.bak"
  # find . -regex ".*\.\(sh\|bak\)"
  并且条件查找文件:
  # find . -name "*.sql" -a -size +1024k
  只显示第一级目录:
  # find /etc -type d -maxdepth 1
  通过 inode 编号删除文件:
  # rm `find . -inum 671915`
  # find . -inum 8651577 -exec rm -i {} \;
  11.28 xargs
  功能:从标准输入执行命令
  常用选项:
  -a file 从指定文件读取数据作为标准输入
  -0 处理包含空格的文件名,print0
  -d delimiter 分隔符,默认是空格分隔显示
  -i 标准输入的结果以{}代替
  -I 标准输入的结果以指定的名字代替
  -t 显示执行命令
  -p 交互式提示是否执行命令
  -n 最大命令行参数
  --show-limits 查看系统命令行长度限制
  示例:
  删除/tmp 下名字是 core 的文件:
  # find /tmp -name core -type f -print | xargs /bin/rm -f
  # find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f
  列转行(去除换行符 ):
  # cut -d: -f1 < /etc/passwd | sort | xargs echo
  行转列:
  # echo "1 2 3 4 5" |xargs -n1
  最长两列显示:
  # echo "1 2 3 4 5" |xargs -n2
  创建未来十天时间:
  # seq 1 10 |xargs -i date -d "{} days " +%Y-%m-%d
  复制多个目录:
  # echo dir1 dir2 |xargs -n1 cp a.txt
  清空所有日志:
  # find ./ -name "*.log" |xargs -i tee {} # echo ""> {} 这样不行,>把命令中断了
  rm 在删除大量的文件时,会提示参数过长,那么可以使用 xargs 删除:
  # ls |xargs rm –rf
  或分配删除 rm * -rf # getconf ARG_MAX 获取系统最大参数限制
  11.29nl
  功能:打印文件行号
  常用选项:
  -b指定行号显示方式,a 表示所有行都打印行号,b 表示空行不显示行号,默认是 a
  -n行号显示方法,ln 左对齐,rn 右对齐,rz 右边显示,左边空白用 0 填充。
  -w 行号栏位在左边占用的宽度
  示例:
  打印行号,空行不显示:
  # nl a.txt
  左对齐打印行号:
  # nl -n ln a.txt
  行号右移动五个空格:
  # nl -w 5 a.txt
  11.30 date
  功能:打印或设置系统日期和时间
  常用选项:
  -d string 显示时间所描述的字符串
  -f datefile 读取文件的每一行
  -I 输出 ISO 8601 格式的日期和时间
  -r 显示文件的最后修改时间
  -R 输出 RFC 2822 格式的日期和时间
  -s string 设置时间所描述的字符串
  -u 打印或设置 UTC 时间
  控制输出格式:
  %n : 下一行
  %t : 跳格
  %H : 小时(00..23)
  %I : 小时(01..12)
  %k : 小时(0..23)
  %l : 小时(1..12)
  %M : 分钟(00..59)
  %p : 显示本地 AM 或 PM
  %r : 直接显示时间 (12 小时制,格式为 hh:mm:ss M)
  %s : 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数
  %S : 秒(00..61)
  %T : 直接显示时间 (24 小时制)
  %X : 相当于 %H:%M:%S
  %Z : 显示时区 %a : 星期几 (Sun..Sat)
  %A : 星期几 (Sunday..Saturday)
  %b : 月份 (Jan..Dec)
  %B : 月份 (January..December)
  %c : 直接显示日期与时间
  %d : 日 (01..31)
  %D : 直接显示日期 (mm/dd/yy)
  %h : 同 %b
  %j : 一年中的第几天 (001..366)
  %m : 月份 (01..12)
  %U : 一年中的第几周 (00..53) (以 Sunday 为一周的第一天的情形)
  %w : 一周中的第几天 (0..6)
  %W : 一年中的第几周 (00..53) (以 Monday 为一周的第一天的情形)
  %x : 直接显示日期 (mm/dd/yy)
  %y : 年份的最后两位数字 (00.99)
  %Y : 完整年份 (0000..9999)
  示例:
  设置系统日期和时间:
  # date -s "2016-12-15 00:00:00"
  查看当前系统时间戳:
  # date +%s
  查看当前系统时间:
  # date +'%F %T'
  把日期和时间转换成时间戳:
  # date -d "2016-12-15 18:00:00" +%s
  把时间戳转成时间:
  # date -d '@1481842800' '+%F %T'
  时间加减:
  显示前一分钟:date -d '-1 minute' +'%F %T'
  显示上一周:date -d '-1 week' +'%F %T'
  显示前一天日期:date +%F -d '+1 day'
  显示后一天日期:date +%F -d '-1 day'
  显示上一个月日期:date +%F -d '+1 month'
  显示下一个月日期:date +%F -d '-1 month'
  显示上一年日期:date +%F -d '+1 year'
  显示下一年日期:date +%F -d '-1 year'
  或
  显示前一天日期:date -d yesterday +%F
  显示后一天日期:date -d tomorrow +%F
  天为单位,显示前一天现在时间:date -d '1 day ago' +'%F %T'
  秒为单位,显示一小时前现在时间:date -d '3600 second ago' +'%F %T'
  时间比较:
  NOW_DATE=$(date +'%F %T')
  AGO_DATE=$(date -d "2016-12-15 18:00:00" +%s)
  [ $NOW_DATE -gt $AGO_DATE ] && echo yes || echo no
  11.31wget
  功能:非交互式网络下载,类似于 HTTP 客户端
  常用选项:
  -b, --background 后台运行
  日志记录和输入文件:
  -o, --output-file=FILE 日志写到文件
  -a, --append-output=FILE 日志追加到文件
  -d, --debug 打印 debug 信息,会包含头信息
  -q, --quiet 退出,不输出
  -i, --input-file=FILE 从文件中读取 URL 下载
  下载选项:
  -t, --tries=NUMBER 设置链接重试次数
  -O, --output-document=FILE 写入内容到文件
  -nc, --no-clobber 跳过下载现有的文件
  -c, --continue 断点续传
  --progress=TYPE 设置进度条(dot 和 bar)
  -S, --server-response 打印服务器响应头信息
  --spider 不下载任何内容
  -T, --timeout=SECONDS 设置相应超时时间(还有--dns-timeout、--connect-timeout 和
  --read-timeout)
  -w, --wait=SECONDS 两次重试间隔等待时间
  --bind-address=ADDRESS 设置绑定地址
  --limit-rate=RATE 限制下载速度
  --user=USER 设置 ftp 和 http 用户名
  --password=PASS 设置 ftp 和 http 密码
  目录:
  -P, --directory-prefix=PREFIX 保存文件目录
  HTTP 选项:
  --http-user=USER 设置 http 用户名
  --http-password=PASS 设置 http 密码
  --proxy-user=USER 设置代理用户名
  --proxy-password=PASS 设置代理密码
  --referer=URL 设置 Referer
  --save-headers 保存头到文件
  --default-page=NAME 改变默认页面名字,默认 index.html
  -U,--user-agent=AGENT 设置客户端信息
  --no-http-keep-alive 禁用 HTTP keep-alive(长连接)
  --load-cookies=FILE 从文件加载 cookies
  --save-cookies=FILE 保存 cookies 到文件
  --post-data=STRING 使用 POST 方法,发送数据
  FTP 选项:
  --ftp-user=USER 设置 ftp 用户名
  --ftp-password=PASS 设置 ftp 密码
  --no-passive-ftp 禁用被动传输模式
  递归下载:
  -r, --recursive 指定递归下载
  -l, --level=NUMBER 最大递归深度
  -A, --accept=LIST 逗号分隔下载的扩展列表
  -R, --reject=LIST 逗号分隔不被下载的扩展列表
  -D, --domains=LIST 逗号分隔被下载域的列表
  --exclude-domains=LIST 排除不被下载域的列表
  示例:
  下载单个文件到当前目录:
  # wget http://nginx.org/download/nginx-1.11.7.tar.gz
  放到后台下载:
  # wget -b http://nginx.org/download/nginx-1.11.7.tar.gz
  对于网络不稳定的用户使用-c 和--tries 参数,保证下载完成,并下载到指定目录:
  # wget -t 3 -c http://nginx.org/download/nginx-1.11.7.tar.gz -P down
  不下载任何内容,判断 URL 是否可以访问:
  # wget --spider http://nginx.org/download/nginx-1.11.7.tar.gz
  下载内容写到文件:
  # wget http://www.baidu.com/index.html -O index.html
  从文件中读取 URL 下载:
  # wget -i url.list
  下载 ftp 文件:
  # wget --ftp-user=admin --ftp-password=admin ftp://192.168.1.10/ISO/CentOS-6.5-i386-
  minimal.iso
  伪装客户端,指定 user-agent 和 referer 下载:
  # wget -U "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
  Chrome/44.0.2403.157 Safari/537.36" --referer "http://nginx.org/en/download.html"
  http://nginx.org/download/nginx-1.11.7.tar.gz
  查看 HTTP 头信息:
  # wget -S http://nginx.org/download/nginx-1.11.7.tar.gz
  # wget --debug http://nginx.org/download/nginx-1.11.7.tar.gz
  11.32 curl
  功能:发送数据到 URL,类似于 HTTP 客户端
  常用选项:
  -C, --continue-at 断点续传
  -b, --cookie STRING/FILE 从文件中读取 cookie
  -c, --cookie-jar 把 cookie 保存到文件
  -d, --data 使用 POST 方式发送数据
  --data-urlencode POST 的数据 URL 编码
  -F, --form 指定 POST 数据的表单
  -D, --dump-header 保存头信息到文件
  --ftp-pasv 指定 FTP 连接模式 PASV/EPSV
  -P, --ftp-port 指定 FTP 端口
  -L, --location 遵循 URL 重定向,默认不处理
  -l, --list-only 指列出 FTP 目录名
  -H, --header 自定义头信息发送给服务器
  -I, --head 查看 HTTP 头信息
  -o, --output FILE 输出到文件
  -#, --progress-bar 显示 bar 进度条
  -x, --proxy HOST[:PORT] 使用代理
  -U, --proxy-user USER[:PASSWORD] 代理用户名和密码
  -e, --referer 指定引用地址 referer
  -O, --remote-name 使用远程服务器上名字写到本地
  --connect-timeout 连接超时时间,单位秒
  --retry NUM 连接重试次数
  --retry-delay 两次重试间隔等待时间
  -s, --silent 静默模式,不输出任何内容
  -Y, --speed-limit 限制下载速率
  -u, --user USER[:PASSWORD] 指定 http 和 ftp 用户名和密码
  -T, --upload-file 上传文件
  -A, --user-agent 指定客户端信息
  示例:
  下载页面:
  # curl -o badu.html http://www.baidu.com
  不输出下载信息:
  # curl -s -o baidu.html http://www.baidu.com
  伪装客户端,指定 user-agent 和 referer 下载:
  # curl -A "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
  Chrome/44.0.2403.157 Safari/537.36" -e "baike.baidu.com" http://127.0.0.1
  模拟用户登录,并保存 cookies 到文件:
  # curl -c ./cookies.txt -F NAME=user -F PWD=123 http://www.example.com/login.html
  使用 cookie 访问:
  # curl -b cookies.txt http://www.baidu.com
  访问 HTTP 认证页面:
  # curl -u user:pass http://www.example.com
  FTP 上传文件:
  # curl -T filename ftp://user:pass@ip/a.txt
  # curl ftp://ip -u user:pass-T filename
  FTP 下载文件:
  # curl -O ftp://user:pass@ip/a.txt
  # curl ftp://ip/filename -u user:pass -o filename
  FTP 下载多个文件:
  # curl ftp://ip/img/.jpg
  查看 HTTP 头信息:
  # curl -I http://www.baidu.com
  11.33scp
  功能:基于 SSH 的安全远程服务器文件拷贝
  常用选项:
  -i 指定私钥文件
  -l 限制速率,单位 Kb/s,1024Kb=1Mb
  -P 指定远程主机 SSH 端口
  -p 保存修改时间、访问时间和权限
  -r 递归拷贝目录
  -o SSH 选项,有以下常用的:
  ConnectionAttempts=NUM 连接失败后重试次数
  ConnectTimeout=SEC 连接超时时间
  StrictHostKeyChecking=no 自动拉去主机 key 文件
  PasswordAuthentication=no 禁止密码认证
  示例:
  本地目录推送到远程主机:
  # scp -P 22 -r src_dir root@192.168.1.10:/dst_dir
  远程主机目录拉取到本地:
  # scp -P 22 root@192.168.1.10:dst_dir src_dir
  同步文件方式一样,不用加-r 参数
  11.34rsync
  功能:远程或本地文件同步工具
  常用选项:
  -v 显示复制信息
  -q 不输出错误信息
  -c 跳过基础效验,不判断修改时间和大小
  -a 归档模式,等效-rlptgoD,保留权限、属组等
  -r 递归目录
  -l 拷贝软连接
  -z 压缩传输数据
  -e 指定远程 shell,比如 ssh、rsh
  --progress 进度条,等同-P
  --bwlimit=KB/s 限制速率,0 为没有限制
  --delete 删除那些 DST 中 SRC 没有的文件
  --exclude=PATTERN 排除匹配的文件或目录
  --exclude-from=FILE 从文件中读取要排除的文件或目录
  --password-file=FILE 从文件读取远程主机密码
  --port=PORT 监听端口
  示例:
  本地复制目录:
  # rsync -avz abc /opt
  本地目录推送到远程主机:
  # rsync -avz SRC root@192.168.1.120:DST
  远程主机目录拉取到本地:
  # rsync -avz root@192.168.1.10:SRC DST
  保持远程主机目录与本地一样:
  # rsync -avz --delete SRC root@192.168.1.120:DST
  排除某个目录:
  # rsync -avz --exclude=no_dir SRC root@192.168.1.120:DST
  指定 SSH 端口:
  # rsync -avz /etc/hosts -e "ssh -p22" root@192.168.1.120:/opt
  11.35nohup
  功能:运行命令,忽略所有挂起信号
  常用选项:
  示例:
  后台运行程序,终端关闭不影响:
  # nohup bash test.sh &>test.log &
  11.36iconv
  功能:将文件内容字符集转成其他字符集
  常用选项:
  -l 列出所有已知的编码字符集
  -f 编码原始文本
  -t 输出的编码格式
  -o 输出到文件
  -s 不输出警告
  示例:
  将文件内容转换 UTF8:
  # iconv -f gbk -t utf8 old.txt -o new.txt
  将 csv 文件转换 GBK:
  # iconv -f utf8 -t gbk old.txt -o new.txt
  解决邮件乱码:
  # echo $(echo "content" | iconv -f utf8 -t gbk) | mail -s "$(echo "title" | iconv -f
  utf8 -t gbk)" dst@163.com
  11.37uname
  功能:打印系统信息
  常用选项:
  -a 打印所有信息
  -s 打印内核名称
  -n 打印主机名
  -r 打印内核发行版
  -v 打印内核版本
  -m 打印机器硬件名
  -p 打印处理器类型
  -i 打印硬件平台
  -o 打印操作系统
  示例:
  打印所有系统信息:
  # uname -a
  打印主机名:
  # uname -a
  打印内核版本:
  # uname -r
  打印操作系统:
  # uname -o
  11.38 8 sshpass
  功能:非交互 SSH 登录(需要安装)
  常用选项:
  -f 从文件中获取密码
  -d 用数字文件描述符获取密码
  -p 密码作为参数
  -e 密码作为环境变量传递,变量名是 SSHPASS
  示例:
  免交互 SSH 登录:
  # sshpass -p 123456 ssh root@192.168.1.10
  免交互传输文件:
  # sshpass -p 123456 scp a.txt 192.168.1.10:/root
  密码传入系统变量:
  # SSHPASS=123456 rsync -avz /etc/hosts -e "sshpass -e ssh" root@192.168.1.221:/opt
  11.39 9 tar
  功能:归档目录或文件
  常用选项:
  -c 创建新归档
  -d 比较归档和文件系统的差异
  -r 追加文件到归档
  -t 存档的内容列表
  -x 提取归档所有文件
  -C 改变解压目录
  -f 使用归档文件或设备归档
  -j bzip2 压缩
  -z gzip 压缩
  -v 输出处理过程
  示例:
  创建归档文件来自 foo 和 bar:
  # tar -cf archive.tar foo bar
  提取归档的所有文件:
  # tar -xf archive.tar
  创建归档并 gzip 压缩:
  # tar -zcvf archive.tar.gz log
  提取归档文件并 gzip 解压:
  # tar -zxvf log.tar.gz
  创建归档并 bzip2 压缩:
  # tar -jcvf log.tar.bz log
  列出所有在 archive.tar 的文件:
  # tar -tvf archive.tar
  提取归档并解压到指定目录:
  # tar -zxvf log.tar.gz -C /opt
  11. 40 logger
  功能:系统日志的 shell 命令行接口
  常用选项:

  -i 每行记录进程>  -f 指定输出日志到文件
  -p 设置记录的优先级
  -t 添加标签
  示例:
  # logger -i -t "my_test" -p local3.notice "test_info"
  11.41 netstat
  功能:打印网络连接、路由表、接口统计信息、伪装连接和多播成员
  常用选项:
  -r 显示路由表
  -i 显示接口表
  -n 不解析名字
  -p 显示程序名 PID/Program
  -l 显示监听的 socket
  -a 显示所有 socket
  -o 显示计时器
  -Z 显示上下文
  -t 只显示 tcp 连接
  -u 只显示 udp 连接
  -s 显示每个协议统计信息
  示例:
  显示所有监听:
  # netstat -anltu
  显示所有 TCP 连接:
  # netstat -antp
  显示所有 UDP 连接:
  # netstat -anup
  显示路由表:
  # netstat -r
  11.42ss
  功能:比 netstat 更强大的 socket 查看工具
  格式:ss [ FILTER ]
  常用选项:
  -n 不解析名字
  -a 显示所有 socket
  -l 显示所有监听的 socket
  -o 显示计时器
  -e 显示 socket 详细信息
  -m 显示 socket 内存使用
  -p 显示进程使用的 socket
  -i 显示内部 TCP 信息
  -s 显示 socket 使用汇总
  -4 只显示 IPV4 的 socket
  -0 显示包 socket
  -t 只显示 TCP socket
  -u 只显示 UDP socket
  -d 只显示 DCCP socket
  -w 只显示 RAW socket
  -x 只显示 Unix 域 socket
  -f FAMILY 只显示 socket 族类型( unix, inet, inet6, link, netlink)
  -A 查询 socket {all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY]
  -D 将原始的 TCP socket 转储到文件
  -F 从文件中读取过滤信息
  过滤:
  -o state 显示 TCP 连接状态信息
  示例:
  显示所有 TCP 连接:
  # ss -t -a
  显示所有 UDP 连接:
  # ss -u –a
  显示 socket 使用汇总:
  # ss -s
  显示所有建立的连接:
  # ss -o state established
  显示所有的 TIME-WAIT 状态:
  # ss -o state TIME-WAIT
  搜索所有本地进程连接到 X Server:
  # ss -x src /tmp/.X11-unix/*
  11.43lsof
  功能:列出打开的文件
  常用选项:
  -i 监听的网络地址,如果没有指定,默认列出所有。 来自
  [@hostname|hostaddr][:service|port]
  -U 列出 Unix 域 socket 文件
  -p 指定 PID
  -u 指定用户名或 UID 所有打开的文件
  +D 递归搜索
  示例:
  列出所有打开的文件:
  # lsof
  查看哪个进程占用文件:
  # lsof /etc/passwd
  列出所有打开的监听地址和 unix 域 socket 文件:
  # lsof -i -U
  列出 80 端口监听的进程:
  # lsof -i:80
  列出端口 1-1024 之间的所有进程:
  # lsof -i:1-1024
  列出所有 TCP 网络连接:
  # lsof -i tcp
  列出所有 UDP 网络连接:
  # lsof -i udp
  根据文件描述符列出打开的文件:
  # lsof -d 1
  列出某个目录被打开的文件:
  # lsof +D /var/log

  列出进程>  # lsof -p 5373

  打开所有登录用户名 abc 或 user>  # lsof -p 123,456 -u 123,abc
  列出 COMMAND 列中包含字符串 sshd:
  # lsof -c sshd
  11.44ps
  功能:报告当前进程的快照
  常用选项:
  -a 显示所有进程

  -u 选择有效的用户>  -x 显示无控制终端的进程
  -e 显示所有进程
  -f 全格式
  -r 只显示运行的进程
  -T 这个终端的所有进程

  -p 指定进程>  --sort 对某列排序
  -m 线程
  -L 格式化代码列表
  -o 用户自定义格式
  CODE NORMAL HEADER
  %C pcpu %CPU
  %G group GROUP
  %P ppid PPID
  %U user USER
  %a args COMMAND
  %c comm COMMAND
  %g rgroup RGROUP
  %n nice NI
  %p pid PID
  %r pgid PGID
  %t etime ELAPSED
  %u ruser RUSER
  %x time TIME
  %y tty TTY
  %z vsz VSZ
  示例:
  打印系统上所有进程标准语法:
  # ps -ef
  打印系统上所有进程 BSD 语法:
  # ps aux
  打印进程树:
  # ps axjf 或 ps -ejH
  查看进程启动的线程:
  # ps -Lfp PID
  查看当前用户的进程数:
  # ps uxm 或 ps -U root -u root u
  自定义格式显示并对 CPU 排序:
  # ps -eo user,pid,pcpu,pmem,nice,lstart,time,args --sort=-pcpu
  或 ps -eo "%U %p %C %n %x %a"
  11.45 top
  功能:动态显示活动的进程和系统资源利用率
  常用选项:
  -d 信息刷新时间间隔
  -p 只监控指定的进程 PID
  -i 只显示正在使用 CPU 的进程
  -H 显示线程
  -u 只查看指定用户名的进程
  -b 将输出编排成易处理格式,适合输出到文件处理
  -n 指定最大循环刷新数
  交互命令:
  f 添加或删除显示的指标
  c 显示完整命令
  P 按 CPU 使用百分比排序
  M 按驻留内存大小排序
  T 按进程使用 CPU 时间排序
  1 显示每个 CPU 核心使用率
  k 终止一个进程
  示例:
  刷新一次并输出到文件:
  # top -b -n 1 > top.log
  只显示指定进程的线程:
  # top -Hp 123
  传入交互命令,按 CPU 排序.
  11.46free
  功能:查看内存使用率
  常用选项:
  -b bytes 显示
  -k KB 显示
  -m M 显示
  -g G 显示
  -h 易读单位显示
  -s 每几秒重复打印
  -c 重复打印几次退出
  示例:
  查看物理内存:
  # free -m
  易读单位显示:
  # free -h
  11. 47 df
  功能:查看文件系统的磁盘空间使用情况
  常用选项:
  -a 包含虚拟文件系统
  -h 可易读单位显示
  -i 显示 block 使用的 inode 信息
  -k KB 显示
  -P 使用 POSIX 格式输出
  -t 输出指定文件系统类型
  -T 打印文件系统类型
  示例:
  查看所有文件系统:
  # df -ah
  输出指定文件系统:
  # df -t xfs
  11. 48 vmstat
  功能:报告虚拟内存、swap、io、上下文和 CPU 统计信息。
  分析了这些文件:
  /proc/meminfo
  /proc/stat
  /proc/*/stat
  常用选项:
  -a 打印活跃和不活跃的内存页
  -d 打印硬盘统计信息
  -D 打印硬盘表
  -p 打印硬盘分区统计信息
  -s 打印虚拟内存表
  -m 打印内存分配(slab)信息
  -t 添加时间戳到输出
  -S 显示单位,默认 k、KB、m、M,大写是*1024
  示例:
  分析系统性能:
  # vmstat
  每秒刷新一次,统计五次:
  # vmstat -t 1 5
  11. 49 iostat
  功能:报告 CPU 利用率和磁盘 I/O
  常用选项:
  -c 显示 CPU 使用率
  -d 只显示磁盘使用率
  -k 单位 KB/s 代替 Block/s
  -m 单位 MB/s 代替 Block/s
  -N 显示所有映射设备名字
  -t 打印报告时间
  -x 显示扩展统计信息
  示例:
  显示 CPU 使用率:
  # iostat -c 1 3
  显示 I/O 磁盘统计信息:
  # iostat -d -x -k 1 3 # 间隔 1 秒,输出 3 次
  11.50 0 ip
  功能:查看/操作路由表,设备,路由策略和隧道
  格式:ip [ OPTIONS ] OBJECT { COMMAND | help }
  常用选项:
  -b, -batch从文件或标准输入读取命令并调用他们,第一次失败将终止
  -force 批量模式有错误不终止,如果有错误则状态返回非 0
  -s, -statistics 输出更多的统计信息
  -l, -loops指定最大的循环数
  操作对象(OBEJECT):
  address 网络设备地址
  12tp 以太网 IP 隧道
  link 配置网络设备
  maddress 多播地址
  monitor 动态监控网络连接
  mroute 多播路由缓存条目
  mrule 角色在多播路由策略数据库
  neighbour 管理 ARP 或 NDISC 缓存条目
  netns 管理网络命名空间
  ntable 管理 neighbour 缓存操作
  route 路由表
  rule 角色在路由策略数据库
  tpc_metrics/tcpmetrics 管理 TCP 指标
  tunnel IP 隧道
  tuntap 管理 TUN/TAP 设备
  xfrm 管理 IPSec 策略
  可通过 ip OBEJECT help 再查看对象的操作方法。
  示例:
  查看网络设备地址:
  # ip addr
  查看网卡统计信息:
  # ip -s link
  查看单个网卡统计信息:
  # ip -s link ls eth0
  查看 ARP 缓存表:
  # ip neighbour
  查看路由表:
  # ip route
  查看路由策略:
  # ip rule
  网卡设置/删除 IP:
  # ip addr add/del 192.168.1.201/24 dev eth0
  添加/删除默认路由:
  # ip route add/del default via 192.168.1.1
  开启/关闭网卡:
  # ip link set dev eth0 up/down
  设置最大传输单元:
  # ip link set dev eth0 mtu 1500
  设置 MAC 地址:
  # ip link set dev eth0 address 00:0c:29:52:73:8e
  11.51 1 nc
  功能:TCP 和 UDP 连接和监听
  常用选项:
  -i interval 指定间隔时间发送和接受行文本
  -l 监听模式,管理传入的连接
  -n 不解析域名
  -p 指定本地源端口
  -r 指定本地和远程主机端口
  -s 指定本地源 IP 地址
  -u 使用 udp 协议,默认是 tcp
  -v 执行过程输出
  -w timeout 连接超时时间
  -x proxy_address[:port] 请求连接主机使用代理地址和端口
  -z 指定扫描监听端口,不发送任何数据
  示例:
  端口扫描:
  # nc -z 192.168.1.10 1-65535
  TCP 协议连接到目标端口:
  # nc -p 31337 -w 5 192.168.1.10 22
  UDP 协议连接到目的端口:
  # nc -u 192.168.1.10 53
  指定本地 IP 连接:
  # nc -s 192.168.1.9 192.168.1.10 22
  探测端口是否开启:
  # nc -z -w 2 192.168.1.10 22
  创建监听 Unix 域 Socket:
  # nc -lU /var/tmp/ncsocket
  通过 HTTP 代理连接主机:
  # nc -x10.2.3.4:8080 -Xconnect 10.0.0.10 22
  监听端口捕获输出到文件:
  # nc -l 1234 > filename.out
  从文件读入到指定端口:
  # nc host.example.com 1234 < filename.in
  收发信息:
  # nc -l 1234
  # nc 127.0.0.1 1234
  执行 memcahced 命令:printf "stats\n" |nc 127.0.0.1 11211
  发送邮件:
  # nc [-C] localhost 25
页: [1]
查看完整版本: Shell 常用命令与工具