Linux常用命令之Shell实战

shell基础语法

# shell输入与输出
Read 用来读取输入,并赋值给变量
echo, printf 可以简单输出变量
>file 将输出重定向到另一个文件
>> 表示追加 等价于tee -a
<file 输入重定向
| 表示管道,也就是前一个命令的输出传入到下一个命令的输入
# 文件描述符
输入文件-标准输入0
输出文件-标准输出1
错误输出文件-标准错误2
# 管道
把不同程序的输入和输出连接
可以连接更多的命令
常见的组合命令Linux三剑客
# 示例
# 查看端口为22的连接网络ip数量
netstat -tnp | grep ":22" | awk '{print $5}' | awk -F : '{print $1}'|sort|uniq -c |sort -nr|wc -l
# 常用正则
常用的元字符
.	匹配除换行符以外的任意字符
\w	匹配字母或者数字或下划线或汉字
\s	匹配任意的空白字符
\d	匹配数字
\b	匹配单词的开始或结束
^	匹配字符串的开始
$	匹配字符串的结束
?	非贪婪匹配

常用的限定字符
*		重复零次或更多次
+		重复一次或更多次
?		重复零次或一次
{n}		重复n次
{n,}	重复n次或更多次
{n,m}	重复n到m次
Linux 三剑客
grep+awk+sed

grep
基于正则表达式查找满足条件的行
	-v 显示不被pattern匹配到的行
	-i 忽略字符大小写
	-n 显示匹配的行号
	-c 统计匹配的行数
	-o 仅显示匹配到的字符串
	-E 使用ERE,相当于egrep
	
根据用户指定的模式(pattern)对目标文本进行过滤,显示被模式匹配到的行
grep pattern file
grep -i pattern file	忽略大小写
grep -v pattern file	不显示匹配的行
grep -o pattern file	把每个匹配的内容用独立的行显示
grep -E pattern file	使用扩展正则表达式
grep -A -B -C pattern file	打印命中数据的上下文
grep pattern -r dir /	递归搜索


awk
名字来源于三个作者的名字简称
根据定位到的数据处理其中的分段
awk 理论上可以代替grep
语法:awk 'pattern{action}'

FS		字段分隔符
OFS 	输出数据的字段分隔符
RS		记录分隔符
ORS		输出字段的行分隔符
NF		字段数
NR		记录数
-F		参数指定字段分隔符
BEGIN{FS="_"}	也可以表示分割符

$0		代表当前的记录
$1		代表第一个字段
$N		代表第N个字段
$NF		代表最后一个字段

awk 'BEGIN{}END{}'		开始和结束
awk '/Running/'			正则表达式
awk '/aa/, /bb/'		区间选择
awk '$2~/xxx/' 			字段匹配
awk 'NR==2'				取第二行
awk 'NR>1'				去掉第一行

# awk字段分割
echo $PATH | awk 'BEGIN{RS=":"}{print $0}' | awk -F / '{print $1,$2,$3,$4}'
echo $PATH | awk 'BEGIN{RS=":"}{print $0}' | awk 'BEGIN{FS="/"}{print $1,$2,$3,$4}'
echo $PATH | awk 'BEGIN{RS=":"}{print $0}' | awk 'BEGIN{FS="/|-"}{print $1,$2,$3,$4}'
# 修改OFS和ORS让$0重新计算
echo $PATH | awk 'BEGIN{FS=":";OFS=" | "}{$1=$1;print $0}'
echo $PATH | awk 'BEGIN{RS=":";ORS="^"}{print $0}'

# awk行处理
# 把单行分拆为多行
echo $PATH | awk 'BEGIN{RS=":"}{print $0}'
echo $PATH | awk 'BEGIN{RS=":"}{print NR $0}'
echo $PATH | awk 'BEGIN{RS=":"}END{print NR}'
# 多行组合成单行
echo $PATH | awk 'BEGIN{RS=":"}{print $0}' | awk 'BEGIN{ORS=":"}{print $0}'

sed
根据定位到的数据行修改数据
sed是流编辑器,一次处理一行内容

sed [-hn…][-e][-f<script文件>][文本文件]
-h 显示帮助。
-n 仅显示script处理后的结果。

sed [-hnV][-e][-f<script文件>][文本文件]
-e 以选项中指定的script来处理输入的文本文件。
-f<script文件> 以选项中指定的script文件来处理输入的文本文件。

a :新增 sed -e ‘4 a newline’
c :取代 sed -e ‘2,5c No 2-5 number’
d :删除 sed -e '2,5d’
i :插入 sed -e ‘2i newline’
p :打印 sed -n ‘/root/p’
s :取代 sed -e 's/old/new/g’

练习

# 练习1:统计log文件中404的报错数据,统计下共有多少404报错
awk '$9~/404/' nginx.log | wc -l
# 练习2:找出作业中的404,500的报错
# 练习3:找出访问量最高的ip统计分析,取前3条。
awk '{print $1}' nginx.log | sort | uniq -c | sort -nr | head -3
# 练习四:找出访问 /topics/xxx,以及访问/topics/xxxx/replies 接口请求总共多少
grep -E "/topics/[0-9]{1,}" nginx.log \
| awk '{print $7}'| sed 's#?.*##g' \
| sed 's#/topics/[0-9]*$#/topics/topics#' \
| sed 's#/topics/[0-9]*/replies/[0-9]*/.*#/topics/replies#g' \
| sort|uniq -c |sort -nr|head -5|grep -E "topics/topics|replies"
# 练习五:找出访问量最高的页面地址,借助于sed的统计。只要标准路径,把变化的数字,或者变化的噪音字段全部去掉
# 给出top10的最多路径访问数据
注意:
1、调试的时候尽量用less,少用cat
2、数据量过大时,使用head读取指定的数据行

Linux三剑客进阶

三剑客命令主要侧重于数据的分析

性能分析
# 查看当前开放的端口和进程
netstat -tnlp
# 压测时统计当前机器的连接数,sed 1,2d 去除前两行
netstat -tnp | sed 1,2d | awk '{print $5}' | awk -F : '{print $1}' | sort | uniq -c|sort -nr
# 通过ps统计cpu的数据是不准的,cputime/realtime会导致这个数据在进程运行很久后总体值很小
# 利用top统计cpu mem, 每秒统计一次,一共统计20次
top -b -p 2044 -d 1 -n 20
# 打印20次进程的cpu和mem的数据,并输出平均值
top -b -p 28845 -d 1 -n 20 | grep --line-buffered  28845 |awk 'BEGIN{OFS="\t";print "cpu","mem","avgc","avgm"}{c+=$9;m+=$10;print $9,$10,c/NR,m/NR}'
# 通过管道读取数据并绘图
top -b -p 28845 -d 1 -n 20 \
| grep --line-buffered  28845 \
| awk 'BEGIN{OFS="\t";print "cpu","mem","avgc","avgm"}{c+=$9;m+=$10;print $9,$10,c/NR,m/NR}' \
| gnuplot -e "set term dumb;plot '< cat' using 1 w l"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值