linux 命令
大部分命令的帮助文档都可以通过 命令名 -h/--help
或 man 命令名
查看, 推荐优先阅读其英文 man 手册, 可以结合其它中文资料. man.linuxde.net 网站仅供一般性参考, 翻译不太好.
pipe
pipe 管道命令操作符是: “ | ”, 它仅能处理经由前面一个指令传出的正确输出信息, 也就是 standard output 的信息, 将其递给下一个命令, 作为标准的输入 standard input. 但是对于 stdandard error 信息没有直接处理能力. |
https://www.cnblogs.com/blackay03/p/7838317.html
netstat
打印网络状态信息
netstat [OPTION]
netstat -a # 列出所有连接信息
netstat -at # 列出所有tcp协议连接信息
netstat -au # 列出所有udp协议连接信息
netstat -l # 只显示监听端口信息
netstat -lt # 只列出所有tcp协议监听端口信息
netstat -lu # 只列出所有udp协议监听端口信息
netstat -n # 以数字形式显示连接中的地址信息
netstat -anp # 以数字形式显示连接中的地址信息, 显示进程号和程序名
netstat -anp | grep "java" | wc -l #查看java进程数
ss
打印网络状态信息, 和netstat类似, 但更好用
ss [OPTION]
#-a 显示所有 -t 显示tcp协议 -l 显示监听状态
ss -t -a
ss -t -a -l
ss -t -a -l |grep 5672
ss -antup
curl
命令行文件传输工具, 支持 http,https,ftp 等众多协议, 支持断点续传
如果请求比较复杂不知道有哪些参数和Header, 可以打开浏览器的开发者工具后访问页面, 切换到Network栏, 找到并选择请求行, 点击右键Copy–Copy as cURL, 粘贴出来稍加修改, 如图
curl [OPTION] <url>
# 调用服务 -X 指定http方法 -H http头 --data-binary/-d 参数
curl -XPOST -H 'Content-Type: text/json; charset=UTF-8' --data-binary '{"msg":{"usercode":"guest","userpw":"111111","spaceid":"bjfeidao_353","logintypenew":"usercode"},"spaceid":"bjfeidao_353","type":"loginservice.userlogin"}' 'http://192.168.40.181/sendmessage'
# 由于header中有gzip压缩, 使用 --compressed 解压
curl -XGET 'http://61.163.79.140:15100/nongfu_t/getip' -H 'Pragma: no-cache' -H 'Accept-Encoding: gzip, deflate' -H 'Content-Type: text/json; charset=UTF-8' -H 'Cache-Control: no-cache' -H 'X-Requested-With: XMLHttpRequest' -H 'Connection: keep-alive' -H 'Referer: http://172.16.15.43:8000/pages/test.html' --data-binary '{}' --compressed
curl -XGET 'http://61.163.79.140:15100/nongfu_t/getip' -H 'Pragma: no-cache' -H 'Content-Type: text/json; charset=UTF-8' -H 'Cache-Control: no-cache' -H 'X-Requested-With: XMLHttpRequest' -H 'Connection: keep-alive' -H 'Referer: http://172.16.15.43:8000/pages/test.html' --data-binary '{}'
# 发短信
curl -v -X POST -H "Content-Type:application/x-www-form-urlencoded;charset=UTF-8" -d "account=username001&password=password001&mobile=15038089285&content=您的验证码是:abcd。请不要把验证码泄露给其他人并尽快完成操作。" http://106.ihuyi.cn/webservice/sms.php?method=Submit
# 调用文件服务下载 -O 保存的文件名和服务器上的相同
curl -v 'http://192.168.40.181/fsweb/getfile?productid=bjfeidao_353&id=451ca78b307346c1a627401f5c6aac25.jpeg' -H 'Accept-Encoding: gzip, deflate' -H 'Accept: image/webp,image/apng,image/*,*/*;q=0.8' --compressed -O
curl -v 'http://192.168.40.181/fsweb/getfile?productid=bjfeidao_353&id=451ca78b307346c1a627401f5c6aac25.jpeg' -H 'Accept: image/webp,image/apng,image/*,*/*;q=0.8' -O
# 调用文件服务上传base64格式
curl -v -X POST -H 'Content-Type: text/json; charset=utf-8' -H 'X-Requested-With: XMLHttpRequest' -d '{"file_string":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAM1BMVEUAAAAAYK8AYa8AYK8AYa8AYa8AYq8AYa8AYK8AYa8AYK8AYa8AX68AYK8AYa8AYrD////iTE1+AAAAD3RSTlMAYMAg0PCA4BCgQJBwMLCPnbs3AAAAAWJLR0QQlbINLAAAAAlwSFlzAAAAYAAAAGAA8GtCzwAAAAd0SU1FB+EFEhIHN8tiNjUAAABxSURBVBjTbY9ZEsAgCEMBQezK/W/biN2m0/y9GCIQQSwBCdNQ0TilJdlOkurWHR3xRjTBxTzQ52zqL0zo05ZdnlGKwGDjRWRUwaht8XXe7DaKrtdAGs4V6YuDRPZ7sSxlkxfjW9J3QPvq/rCVv+M+5x+Chwj6tH3bvQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxOC0wMi0yOFQxMzozMzozNSswODowMFuyIKcAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTctMDUtMThUMTg6MDc6NTUrMDg6MDBefiDLAAAAAElFTkSuQmCC"}' http://192.168.40.181/fsweb/upload?productid=boai
curl -v -X POST -H 'Content-Type: text/json; charset=utf-8' -H 'X-Requested-With: XMLHttpRequest' -d '{"file_string":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAM1BMVEUAAAAAYK8AYa8AYK8AYa8AYa8AYq8AYa8AYK8AYa8AYK8AYa8AX68AYK8AYa8AYrD////iTE1+AAAAD3RSTlMAYMAg0PCA4BCgQJBwMLCPnbs3AAAAAWJLR0QQlbINLAAAAAlwSFlzAAAAYAAAAGAA8GtCzwAAAAd0SU1FB+EFEhIHN8tiNjUAAABxSURBVBjTbY9ZEsAgCEMBQezK/W/biN2m0/y9GCIQQSwBCdNQ0TilJdlOkurWHR3xRjTBxTzQ52zqL0zo05ZdnlGKwGDjRWRUwaht8XXe7DaKrtdAGs4V6YuDRPZ7sSxlkxfjW9J3QPvq/rCVv+M+5x+Chwj6tH3bvQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxOC0wMi0yOFQxMzozMzozNSswODowMFuyIKcAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTctMDUtMThUMTg6MDc6NTUrMDg6MDBefiDLAAAAAElFTkSuQmCC","productid":"boai"}' http://192.168.40.181/fsweb/upload
curl -v -XPOST 'http://192.168.40.181/fsweb/upload' -H 'Pragma: no-cache' -H 'Accept-Encoding: gzip, deflate' -H 'Content-Type: text/json; charset=UTF-8' -H 'Accept: */*' -H 'Cache-Control: no-cache' -H 'X-Requested-With: XMLHttpRequest' -H 'Connection: keep-alive' --data-binary '{"productid":"bjfeidao_353","file_string":"data:image/png;base64,此处替换为文件base64值"}' --compressed
# 其它示例
curl http://man.linuxde.net/text.iso --silent -O # --silent不显示进度 -O 下载保持原有文件名
curl http://man.linuxde.net/test.iso -o filename.iso --progress # --progress 显示进度条 -o 将下载数据写入到指定名称的文件
# -C - 断点续传
curl http://192.168.40.181/public/apk/ggpt/com.victop.ggpt.apk --silent -O -C -
# ------------ftp操作------------
# 列出目录 -u 指定用户名密码
curl -u anonymous:123456 ftp://192.168.40.198
# 上传 -T 指定文件
curl -u username001:password001 -T filename001 ftp://192.168.40.198/文件流转/
# 下载具体文件
curl -O ftp://192.168.40.198/文件流转/gxd/gxd.zip
wget
下载工具, 支持断点续传
linux工具之curl与wget高级使用 http://lizhenliang.blog.51cto.com/7876557/1650663
wget [OPTION]... [URL]...
wget -c http://www.linuxde.net/testfile.zip # -c 支持断点续传
wget --limit-rate=300k http://www.linuxde.net/testfile.zip # 限速下载
wget -i filelist.txt # -i 下载多个文件, filelist.txt 写入文件下载来源
# --miror 镜像下载 -p 下载html页面中引用的文件 --convert-links 下载后将html中引用文件的url转换成本地相对路径url -P 本地保存目录
wget --mirror -p --convert-links -P /tmp http://www.daokes.com
# ------------ftp操作------------
# -r 递归下载目录 -nH 保存时去掉目录名中的主机信息 -P 保存到/tmp目录 --restrict-file-names=nocontrol 处理下载中的中文乱码
wget -r -nH -P /tmp --restrict-file-names=nocontrol ftp://username001:123456@192.168.40.198/文件流转/1-研究院/css3.0
# 匿名下载
wget -r -nH -P /tmp --restrict-file-names=nocontrol ftp://192.168.40.198/文件流转/1-研究院/css3.0
# 下载到目录 /tmp, 只保留目标文件夹名, 去掉/文件流转/1-研究院/ --cut-dirs=2 保存时不创建主机信息后2层目录结构
wget -r -nH -P /tmp --restrict-file-names=nocontrol --cut-dirs=2 ftp://username001:123456@192.168.40.198/文件流转/1-研究院/css3.0
rsync
文件同步/备份工具
rsync [OPTION] src dst
# src 后加/表示在 dst 不创建 src 目录, 只复制 src 目录下的内容到 dst 下
rsync -avP /tmp/server_py/ /data/server_py
# 使用 ssh 通道传输文件, 需要双方机器安装好 rsync
rsync -avP -e ssh root@192.168.40.202:/data/feidao/* /tmp
# 非标准ssh端口
rsync -avP -e 'ssh -p 1234' root@192.168.40.202:/data/feidao/* /tmp
# --delete 删除那些DST中有而SRC没有的文件(小心使用, 有时你可能需要在目标位置保留那些文件)
# --exclude 同步时排除指定名称的文件或目录
rsync -avP -e ssh --delete --exclude=node_modules root@192.168.40.202:/data/feidao/* /tmp
# --delete-before 传输之前删除 --delete-after 传输之后删除 --del/--delete-during 传输过程中删除 --delete-delay 传输过程中查找删除的文件, 之后删除
# if none of the --delete-WHEN options are specified, rsync will choose the --delete-during algorithm when talking to rsync 3.0.0 or newer, and the --delete-before algorithm when talking to an older rsync
# --exclude-from 排除包含在ex.txt中的文件(按行写, 支持通配符如*) --include-from 包含指定文件
rsync -avP -e ssh --delete --exclude-from=ex.txt root@192.168.40.202:/data/feidao/* /tmp
# 同步时排除文件, 且 --delete-excluded 删除排除的文件
rsync -avP -e ssh --delete-excluded --exclude=feidao-common* /tmp/server_py/ root@192.168.40.202:/tmp/server_py
# -b 同步时备份原文件 --backup-dir 备份到指定位置, 建议使用绝对路径
alias now='date +%Y%m%d%H%M%S'
now=`date +%Y%m%d%H%M%S`
rsync -avPb --backup-dir=/data/back/server-py-`now` /tmp/server_py/ /data/server_py
# 运维常用的更新服务器
alias now='date +%Y%m%d%H%M%S'
# 如果不用/, 可能不会删掉dst中 计划删除的文件
# 如果 用/, 可能 会删掉dst中不计划删除的文件
rsync -avPb -e ssh --delete --backup-dir=/tmp/server_py-`now` /tmp/server_py/* root@192.168.40.202:/tmp/server_py/
rsync -avPb -e ssh --delete --backup-dir=/tmp/server_py-`now` /tmp/server_py/ root@192.168.40.202:/tmp/server_py/
rsync -avPb -e ssh --delete --backup-dir=/tmp/server_py-`now` /tmp/server_py/lib/ root@192.168.40.202:/tmp/server_py/lib
# rsync -avPb -e ssh --delete --backup-dir=server_py-`now` /tmp/server_py/ root@192.168.40.202:/tmp/server_py/ 相对路径, 多次同步时 会生成复杂的嵌套结构
# rsync -avPb -e ssh --delete --backup-dir=server_py-`now` /tmp/server_py/* root@192.168.40.202:/tmp/server_py/ 相对路径, 多次同步时不会生成复杂的嵌套结构
find
文件查找工具
https://www.cnblogs.com/peida/archive/2012/11/16/2773289.html
https://www.cnblogs.com/xqzt/p/5427173.html
http://blog.csdn.net/wirelessqa/article/details/11866987
find [OPTION] [path...] [expression]
OPTION
[-H] [-L] [-P] [-D debugopts] [-Olevel]
-O 指定对查询表达式采用的优化级别, 有3个级别. 1 基于名字匹配 2 基于名字匹配之后基于 -type or -xtype 等
path 路径, 相对或绝对
expression 表达式, 可以包含以下组成部分
OPTIONS 指定命令的选项, 如 -regextype 设置使用哪种类型的正则解析引擎, -maxdepth 设置递归搜索的目录深度
TESTS 查询条件, 如 -name 指定搜索的文件名, -type 指定文件类型
ACTIONS 针对查找结果执行的动作, 如 -print 打印结果, -exec 执行指定的命令
OPERATORS 操作符, 如 ! 表达式非, -o 表达式或
一般初学者在不同的shell环境下使用时可能遇到最多的错误提示 'paths must precede expression', 把表达式加上引号''解决, 另外有时候如果没查到结果, 可以加上引号试试
如 find . -name *.c -print 改为 find . -name '*.c' -print 或 find . -name \*.c -print
# 在 /tmp 目录下查找, 下载nginx代码做测试对象
cd /tmp
wget -c http://nginx.org/download/nginx-1.12.2.tar.gz
tar -zxf nginx-1.12.2.tar.gz
find /tmp -name nginx
find /tmp -name nginx.*
find /tmp ! -name 'nginx.*'
find /tmp -name 'nginx*'
find /tmp -name *.c
# -iname 查找时忽略大小写
find /home -iname "*.txt"
# 当前目录及子目录下查找所有以.txt和.pdf结尾的文件
find . -name "*.txt" -o -name "*.pdf"
# -path 匹配文件路径
find /usr/ -path "*local*"
# -regex 正则匹配 -iregex 忽略大小写的正则
find . -regex ".*\(\.txt\|\.pdf\)$"
# -maxdepth <目录层级>:设置最大目录层级;-mindepth<目录层级>:设置最小目录层级;
find / -maxdepth 3 -name "docker"
# 搜索最近七天内被访问过的所有文件 -atime(时间戳) -type 文件类型
find . -type f -atime -7
UNIX/Linux文件系统每个文件都有三种时间戳:
访问时间(-atime/天,-amin/分钟):用户最近一次访问时间。
修改时间(-mtime/天,-mmin/分钟):文件数据最后一次修改时间。
变化时间(-ctime/天,-cmin/分钟):文件元数据(例如权限等)最后一次修改时间。
# 搜索大于10KB的文件 -size 根据文件大小搜索
find . -type f -size +10k
# -delete 删除匹配的结果
find . -type f -name "*.txt" -delete
# -exec {} 用于与 -exec 选项结合使用来匹配所有文件
# 把当前目录下所有root用户的文件更改属主为 usera
find . -type f -user root -exec chown usera {} \;
# 找出当前目录下所有的 .txt 文件并删除
find ./ -name "*.txt" -ok rm {} \;
# 上例中, -ok和-exec行为一样, 不过它会给出提示, 是否执行相应的操作
# 查找当前目录时 -path ./src/emacs -prune 跳过src/emacs子文件夹及其中的所有内容, 打印出找到的其它所有文件名
find . -path ./src/emacs -prune -o -print
# 查找当前目录或者子目录下名称匹配ngx*的文件或目录, -path ./nginx-1.12.2/src -prune 指定跳过./nginx-1.12.2/src目录
find ./ -path ./nginx-1.12.2/src -prune -o -name 'ngx*'
find ./ -path ./nginx-1.12.2/src -prune -o -name 'ngx*' -print
# 查找 ./nginx-1.12.2 目录下所有以 ngx* 命名的目录及文件 mv 到 /tmp/back 下, 针对多次 mv 的名字冲突, 使用 -S 加后缀不覆盖之前的文件
find ./nginx-1.12.2 -path ./nginx-1.12.2/src -prune -o -name 'ngx*' -exec mv -b -S _1 {} /tmp/back \;
find ./nginx-1.12.2 -path ./nginx-1.12.2/src -prune -o -name 'ngx*' -print
grep
使用正则表达式搜索文本, 并把匹配的行打印出来
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
OPTIONS
# 选择正则解析引擎
-E, --extended-regexp 扩展正则
-F, --fixed-strings, --fixed-regexp
-G, --basic-regexp 基本正则
-P, --perl-regexp Perl 兼容正则, 这个好像比 -E 速度快些
-r 递归目录
--include/--exclude/--exclude-from 搜索时包含或排除指定文件
-v/--invert-match 反转匹配, 显示不匹配的数据
find nginx-1.12.2|grep -v stream
# 标记匹配颜色 --color=auto
grep "nginx" file_name --color=auto
# 使用正则表达式 -E
grep -E "[1-9]+"
# -o 只输出文件中匹配到的部分 -c 输出匹配到的行数
grep -o -E "[a-z]+\."
# -n 输出匹配字符串所在的行号
grep -n -o -E "[a-z]+\."
# -w 匹配完整字符串
grep -w "nginx"
其它示例
目标字符串是soa的一段日志
[polymer] 2017-12-28 19:13:29,161 [FeidaoAkkaSystem-exec-dispatcher-441] … { “key” : “p_group_id” , “value” : { “type” : “string” , “fieldLength” : 50 , “serverDateFlag” : 0 , “sele…(length=1234567890123).msgId=a24b62a9-2da2-498d-add1-1fbbdfb46b22.actionId=fb413ae0-75fa-4067-8823-16f79ac6f2a5.耗时=197ms.
需要匹配 “(length=……)” 字样, 其中 “=” 后数字长度大于等于8
grep -P \(length=[0-9]{8\,}\) a.log
grep -P \(length=[0-9]{8}\) a.log
grep -P '\(length=[0-9]{8,}.*\)' a.log
grep -P '\(length=[0-9]{8,}\)' a.log
tree
显示目录结构
tree [OPTION] [path]
# -N 原样输出不可识别字符如中文 -a 显示隐藏文件
tree -Na /tmp
# -D 显示修改时间 -d 只显示目录
tree -ND
tree -NDd
# -P 只显示匹配模式的文件 -I 不显示匹配模式的文件
tree -N -P *.c
tree -N -I *.c
# -i 不以树形结构显示, -f 显示文件完整路径
tree -Nfi
ps
查看进程信息
# 显示所有进程
# unix posix 兼容语法, 选项加 -, 语法格式可以混用, 有个别选项会冲突
ps -e
ps -ef
ps -eF
ps -ely
# BSD 语法, 选项无 -
ps ax
ps alx
ps aux
# 查看进程树
ps -efjH
ps axjf
# 显示线程信息
ps -eLf
ps axms
输出结果
LWP 线程ID 别名 spid, tid
NLWP 进程中的线程个数 别名 thcount