echo
echo -n 不加换行符
echo -e 解释转义符 (echo -e "hello \t world")
扩展: echo 'hello' > demo.txt -- 直接覆盖 echo 'hello' >> demo.txt -- 追加文本
cat显示行号
cat -n xx
tac 倒序打印文本
tac demo.txt
rev 反向打印每一行
echo "123456" | rev
mkdir
mkdir {a..c} 连续创建目录
mkdir {install,tmp}
mkdir -p /opt/test
rename
参数1: 文件名需要替换的字符串
参数2: 将文件名中含有的原字符替换成目标字符串
参数3: 指定要改变文件名的文件列表
rename .sh .sh.bak *.sh -- 将所有sh脚本文件名.sh 替换成.sh.bak
rename .htm .html *.htm -- 将所有.htm替换成.html
dirname 去除路径的最后一个名字
dirname /data/shell_script/while_sample.sh -> /data/shell_script
dirname /data/shell_script -> /data
dirname while_sample.sh -> .
cut 选取文件的每一行
-b 选中第几个字符
-c 选中多少个字符
-d 指定分隔符分字段,默认是空格
-f 显示选中字段
echo "abc" |cut -b "2" -> b
截取 abc 字符:
echo "abcdef" |cut -c 1-3 -> abc
以冒号分隔,显示第二个字段:
echo "a:b:c" |cut -d: -f2 -> b
打印文件的前1-3个字符(可以用于列分隔)
cat startup.sh |cut -c 1-3
stat 显示文件或文件的系统状态
stat start.sh
seq
seq 10 -> 1到10
seq 1 10 -> 1到10
seq 1 2 10 ->1到10,步长为2
seq -s "" 1 10 -> 指定分隔符 12345678910
shuf
seq 1 10|shuf
shuf -i 5-10
sort
-n 根据字符串数字排序
-r 倒序
seq 10|shuf|sort -n -> 根据字符串数字排序
uniq 去重重复行
sort file|uniq 去重
sort file |uniq -c ->打印重复行数
head 输出文件头几行
head -n 打印前多少行
ss
ss -nat ->显示所有tcp
ss -nlt ->显示listen的tcp连接
ss -nat|awk '{print $1}'|sort|uniq -c
77 CLOSE-WAIT
578 ESTAB
23 LISTEN
1 State
lsof
列出所有 TCP 网络连接:
lsof -i tcp
根据文件描述符列出打开的文件:
列出进程 ID 打开的文件:
lsof -p 5373
top
wa 等待 I/O 响应 CPU 时间 0.0%;
hi 硬中断;
si 软中断;
top -> 按f展示更多指标(展示code,data)
time 执行脚本的时间
time ls
echo不换行
-e 开启转义
-n 不换行
echo -ne
vim重要快捷键
enter -> 换行
nG -> 跳转到第n行
:1,$s/echo/ECHO/g ->替换所有行中的echo-ECHO
grep
grep -E ->正则 例如: grep -E '^21:03:50' acc.log
grep -i ->忽略大小写
grep -r ->递归
grep -o -> 只打印匹配的内容
grep -v -> 打印不匹配的行
pidstat
-u 默认的参数,显示各个进程的CPU使用统计
-r 显示各个进程的内存使用统计
-d 显示各个进程的IO使用情况
-p 指定进程号
-w 显示每个进程的上下文切换情况
-t 显示选择任务的线程的统计信息外的额外信息
pidstat -d -p 29976 1 5 -> 每隔一秒执行一次,总共5次pstree
pstack 查看进程栈、线程栈
pstack 2731
也可查看线程栈perf
全局统计程序运行状态 perf stat -p
实时显示程序性能统计信息 perf top -p
perf record -p-g -g代表保存调用关系图
perf report 也可用插件可以展示火焰图
实例:
perf record -p-g 然后 perf report展示关系 pmap 查看进程内存分配
pmap -x综合实战(top -Hp
-> pstack ) 利用TOP找出CPU占比最高的进程
利用pidstat -p
1 持续观察CPU的变化情况(例如: 是否周期性出现) 利用perf record -p
-g 来记录一段时间内CPU的变化情况 利用perf report 来查看CPU最高的线程
pidstat -p pid -t 查看线程信息
pstack
查看线程工作的情况
######################################
shell 实战
######################################
- shell中单引号、双引号区别
单引号 所见即所得,即输出时会将单引号内的所有内容都原样输出,或者描述为单引号里面看到的什么就输出什么,这成为强引用 - 双引号 输出双引号的所有内容;如果内容中有命令(要反引)、变量、特殊转义,会先把变量、命令、转义字符解析出结果
for ((i=0;i<10;i++))
do
mod=$(($i%2))
if [ $mod -eq 0 ];then
echo "found num: $i" ### found num 0
echo 'found number is: $i' ### found number is: $i
fi
done
小于、等于 lt, gt
小于或等于 le
大于或等于 ge
不相等 ne
for i in `seq 1 20`
do
if [ $i -lt 5 ];then
echo "<5, num is: $i"
elif [ $i -lt 10 ];then
echo "<10, num is: $i"
else
echo "other, num is: $i"
fi
done
- while语法, 自增
#!/bin/bash
num=1
while ((num<100))
do
echo "num is: $num"
((num=num+5))
done
- 中括号(属性测试)
-e 判断是否存在
-d 判断是否为目录
-f 判断是否为普通文件
-r,-w,-x 判断是否可以读写执行
如果目录不存在: [ ! -d xx ]
file=/data/tools/jdk1.8.tar.gz
if [ -e $file ];then
echo "$file is existed"
else
echo "$file is empty"
fi
- 双中括号(字符串比较) [[]]
for i in `seq 1 30`
do
if [[ $i%2 != 0 && $i -gt 10 ]];then
echo "bingo: $i"
fi
done
- 大小写转换
hints="Hello,World, I love my company"
echo "toUpper: "${hints^^} ### 大写
echo "toLower: "${hints,,} ### 小写