这是一篇非常不垂直的blog,日常见到用到的linux命令 & shell语法记录在此。
date
shell中date命令+表示非设置
date +%s
显示当前时间戳
date -d @ts +%Y-%m-%d %H:%M:%S
显示时间戳ts的年月日时分秒格式的时间
date -d $1 +%s
显示输入参数$1的时间戳
@
后面跟时间戳
date 支持语义的转换 例获取上个月的最后一天
date -d `date +%y%m01`"-1 day"
echo
echo -e
支持转义符号
echo -n
不换行输出
column -t
列对齐
set -e
set -e
如果当前shell脚本运行到某一行,code码非0,退出。
set +e
即使code码非0,仍然继续执行下面的逻辑。
引号
shell中的三种引号
curl
语法格式 curl [option] url
option
-o
下载的内容默认输出到屏幕,-o指定输出到指定文件,-o后必须跟文件名 curl -o download.txt url
。
-O
和-o类似,-O是以下载的文件本名作为文件名,也就不用跟文件名了,curl -O url
。
-s
静默模式,不展示下载的进度和速度等信息。
-L
支持重定向。
-m
设置超时时间,curl -m 3 url
。
-w
获取curl的附加信息,通过%{有效名称} 的方式,curl -w %{http_code} url
。
有效名称包括:
名称 | 含义 |
---|---|
http_code | HTTP状态码 |
local_ip | 本地ip |
local_port | 本地端口 |
redirect_url | 重定向URL |
remote_ip | 远端ip |
remote_port | 远端端口 |
size_download | 下载的数据总字节数 |
speed_download | 平均每秒的下载速度 |
time_total | 完成一次连接请求的总时间 |
curl 的用法指南
$
$n
第n个参数,当n=0时,表示这条命令本身
$?
bash上一条命令的返回值,0表示执行成功!
$*
和 $@
都表示全部的参数,不同之处是加了引号后:"$*"
将把所有参数攒成一个字符串,"$@"
把每个参数作为一个字符串返回。
$#
参数的个数。
$!
当前进程号
awk
awk [options] 'pattern {action}' filelist
-F "xx" 指明输入时的字段分隔符
NF 字段数量
NR 当前行号
示例:
awk '{printf("%6.2f %s\n",\$2*\$3,$0)}' xxx.data | sort
按照第2列和第3列的乘积 排序输出,$0是本行
cat access.log.2019070517 | grep /assistantdesk/desk/student/performance | cut -d " " -f 4 | sort | uniq -c | sort -r |head -10
统计日志中第四个参数(例如ip)出现次数最多的前10名
head -1 access.log.2019070517 | awk -F ' ' '{for(i=1;i<=NF;i++){print $i}}' | cat -n
一条日志 行转列 并加行号
grep
grep [options] pattern 文件路径
常用option:
-i : 忽略字母大小写
-v:取反匹配,==过滤
-w:匹配单词,如果grep -w num,那么number不会出来
-q:静默模式
grep --color=auto
高亮匹配
grep -oP pattern
截断匹配的内容
grep xxx -r *
递归匹配当前目录下的xxx
grep "^$"
过滤空白行
grep -v "^$"
过滤非空白行
grep -E "0{1,2}"
-E使grep支持扩展正则,grep -E 可用 egrep代替。非扩展的正则表达式大括号和圆括号都需要转义,很烦。
grep -E 'k1|k2'
匹配k1或者k2
sed 上古神兵
sed [options] '匹配条件&操作指令;匹配条件&操作指令;'
file
options:
选项 | 功能 |
---|---|
-n ,--silent | 因为sed命令默认会向屏幕输出,设置此选项后阻止输出 |
-r | 支持扩展正则,sed默认是不支持扩展正则的 |
-i [suffix] | 直接修改源文件,如果设置了后缀名,sed将将数据备份;sed默认是只修改缓冲区的,并打印到屏幕上 |
-e | 指定需要执行的sed命令,支持使用多个-e参数 |
-f | 指定需要执行的脚本文件,需要提前将sed命令写入文件中 |
基本操作指令
指令 | 功能 |
---|---|
p | 打印当前匹配条件匹配的行 |
l | 打印当前匹配条件匹配的行(显示控制字符) |
= | 打印行号 |
a text | 在匹配的行后添加字符串text,text是独占一行 |
i text | 在匹配的行前添加字符串text,text是独占一行 |
d | 删除匹配的行 |
c text | 将匹配的行的整行替换为text |
r filename | 从filename中读取内容添加到匹配的行后面 |
w filename | 将匹配的行的内容写到文件filename中 |
q [exit code] | 立刻退出sed脚本 |
s/regexp/replace/ | 使用正则匹配,替换匹配到的数据,不是整行哦;regexp是正则表达式,replace是用来替换的字符串 |
s/regexp/replace/g | 加个g,如果一行数据中有多个regexp,都替换成replace |
s/regexp/replace/number | 加个n,如果一行数据中有多个regexp,仅仅替换第n个 |
数据定位方案
格式 | 功能 |
---|---|
数字 | 1就是第一行; 1,3就是第一行到第三行; |
数字1~数字2 | 数字1是起始行号,数字2是步长,例如1~3 等于匹配1,4,7,…… |
数字1,+N | 从数组1开始及其后面N行,例 1,+3 |
$ | 匹配最后一行 |
/regexp/ | 正则表达式 |
\cregexpc | 使用正则表达式匹配,c可以是任意字符,\xAAx将匹配AA |
! | 反操作 |
find
①find path -name "xxx"
按照文件名进行匹配,支持正则
②find path -size +2048
按照文件大小进行匹配,+2048是大于,-2048是小于,2048是等于;
单位是数据块,一个数据块=512字节
③find path -group root
查找所属组是root的
find path -user root
查找所有者是root的
④find path option time
按照时间进行匹配
option :
-amin
访问时间,单位分钟;
-cmin
属性被修改时间,单位分钟;
-mmin
内容被修改时间,单位分钟;
-mtime
内容被修改时间,单位天。
time:
+n
超过n单位, -n
小于n单位, n
等于n单位。
⑤find path -type 类型
根据文件类型进行匹配
类型:f
是文件 ,d
是目录 ,l
是软链接
⑥find path -regex exp
根据正则表达式exp匹配
⑦find -maxdepth n
最多搜索n级子目录;
find -mindepth n
从第n级子目录开始搜索;
find balabala -exec command {}
将find到的路径传给command作为参数
组合使用:
exp. find . -maxdepth 2 -a -name test.php
[①-⑤] -a [①-⑤] and操作
[①-⑤] -o [①-⑤] or操作
xargs
配合find使用,-i 获取管道前的内容放到{}中
find . -type f -name "*.log" | xargs -i cp {} /tmp/k/
find . -type d -name "*.php" | xargs -i rm -rf {}
一些其它搜索:
locate file
在文件资料库中查找文件
updatedb
手动更新资料库
which command
搜索命令所在的目录及别名信息
whereis command
搜索命令所在的目录及帮助文档路径
查看磁盘空间
df -h
du -sh path
scp
推到远端ip
scp -r mypath/dir [email protected]:/remotepath/
拉到我的机器
scp -r [email protected]:/remotepath/dir mypath/
修改登陆
su root
passwd homework(用户名)
passwd
是修改root的登陆密码
rm 命令
1、反向删除 rm -rf !(keep)
除了keep正则匹配的文件都删除
可能会报错,执行 shopt -s extglob
设置bash支持正则匹配,可解决这个问题。
能解决95%以上问题的Linux命令
算数运算
$((2+3))
$[2+3]
let 5*4
整数四则运算
bc
bc计算器
示例:echo "obase=8;15" | bc
将15转换为8进制
条件判断
[\bexp\b] or [[\bexp\b]] or test exp
exp是逻辑判断,\b代表空格,必须有。被测试的表达式exp推荐用双引号引起来。
[]
和[[]]
的区别:
[[]]
支持逻辑运算符 >、 <、 && 、||、==的模式匹配
甚至正则表达式,但是[[]]
在部分脚本解释器中有(Bash\Zsh等)。
docker相关
获取容器id,装填到containers
containers=$(docker ps | grep base | awk '{print $1}' | xargs -i echo {})
遍历容器id,获取IP=10.100.244.13的容器id
for c in $containers; do echo $c; docker inspect $c | grep IPAddress | grep '10.100.244.13' ;done
软链硬链
ln -s 源文件路径 软链名称
创建软链
ln 源文件路径 硬链名称
创建硬链
软链和硬链的区别:
1、源文件被删除后,软链失效,硬链照常读写(本质是硬链指向源文件inode号,多个文件名指向同一个inode号码,一个文件名删除,不影响其它文件名访问);
2、软链可以跨磁盘、分区,硬链不行。
3、软链可以指向文件夹或者文件,硬链只能指向文件。
cpu性能指标
cr :https://www.cnblogs.com/hapjin/p/6296296.html
性能监控命令 | CPU
①user cpu执行用户进程占用的时间片比例
②system cpu执行系统内核进程占用的时间片比例
③idle cpu执行系统缺省空闲进程占用的时间片比例
④nice 改变过优先级的进程(nice值不为0)因优先级改变而额外配分配的时间片比例
⑤wait 等待io消耗的时间片比例
定时脚本 crontab
1、安装cron yum -y install cron
2、root用户 编辑 /etc/crontab 文件
一个定时任务的格式为 cron表达式 用户名 命令
例:注意 dellog.sh中的路径不能写相对路径,会找不到!
3、systemctl restart crond.service
启动crontab生效
查看端口信息
netstat -nltp
lsof -i:8000
netstat -anp | grep ${pid}
查看pid监听的端口,eg.nginx的master进程的pid