介绍
做运维的应该经常用sed和awk等这些工具,但要想把他们用得好绝非易事,需要长时间的积累,
本人积累了一些日常工作中用到的实例,本博客会持续更新。若读者有任何疑问可发表评论进行探讨。
正文
1 如何在shell中获取字符串string的长度
echo ${#string}
2 替换文件text中一个或多个空格
sed -i "s/ \+/||/g" test
注释:\+意思是之前字符的一个或多个
3 删除文件text中“[”和“]”两个字符
sed -i -e "s/\[//g" -e "s/\]//g" text
4 删除noauto关键字和找到匹配行然后替换
sed -i -e 's/,noauto//g' -e '/hadoop/s/\S*$/0/g' /etc/fstab
4 文本text的每一列以逗号分隔,现在要删除第六列,然后输出其他列,每一列以空格分隔
awk 'BEGIN{FS=",";OFS=" "}{$6="";print $0}'
5 输出每个用户所占用的CPU百分比
top -bn 1 | awk '{if (NR>7) print $0}' | awk '{sum[$2]+=$9}END{for (i in sum) printf "%.2f %s\n" ,sum[i],i}' | sort -nr
6 统计nginx的access.log中每个url的访问数和流量,输出前10名
awk '{print $7"\t" $10}' access_2010-12-8.log|awk '{S[$1]+=$2;S1[$1]+=1}END{for(i in S) print S[i],S1[i],i}'|sort -rn|head -10
7 for循环输出连续字符串
for i in hadoop{01..100} ; do echo $i ; done
8 写AWK脚本来获取每行中匹配正则表达式的字段
text.awk
BEGIN {num = 0}
{
for (i = 1; i <= NF ; i++)
{
if ($i ~ "9dn")
{
print $i;
num += 1;
}
}
}
END {
print num;
}
执行
awk -f text.awk text
9 返回匹配的字符串
for i in $(cat text) ; do ls dir/ | grep $i > /dev/null ; if [ $? -ne 0 ] ; then echo $i ;fi ; done
根据返回值:$?是否为0,判断是否输出字符串。
10 获取磁盘设备名与Label之间的对应关系
for i in $(fdisk -l | grep "Disk /dev/sd" | awk '{print $2}' | awk -F ":" '{print $1}') ; do echo $i "---" $(e2label ${i}1); done
11 合并双数行到奇数行
awk 'NR%2{printf "%s",$0;next}{print;}' file.txt
NR%2表示的意思是行数不能被2整除的行,是条件语句。
printf是定义输出格式
next表示下一行
print表示输出所有行,不管是否是奇数行
上面的命令还可以这样写:
awk 'NR%2{printf "%s",$0;next}1' file.txt
1表示始终为真的意思,也就是输出所有行。
若用sed上面的命令可以这样写:
sed 'N;s/\n/ /' file.txt
N表示的是整合每两行为一行。
12 利用awk进行行过滤,并得到硬盘空间最小的盘符
awk '!/^major/ && !/^$/ && ($4 !~ /[a-z]*[0-9]/) {print $4}' /proc/partitions | awk 'BEGIN {size=100000000000000}; {if ($3 < size) {size=$3; disk=$4}};
END {print disk}'
这行命令先排除掉以major开头的行,再排除空行,最后排除以数字结尾的行,之后再循环得到硬盘空间最小的盘符。
13 if语句里面有多个条件
for i in $(awk '{if($NF ~ /sd/ && $NF !~ /[0-9]/) print $NF}' /proc/partitions) ; do parted -s /dev/$i rm 1 ; done
14 根据hadoop的namenode的jsp的jmx页面的数据,统计每个Rack对应的硬盘使用情况
先把第二列过滤下,获取前三个字段
awk '{split($2,a,"."); $2=a[1]"."a[2]"."a[3]; print }' file
再根据第二列,统计最后一列的值并求和
awk '{num[$2]+=1; sum[$2]+=$NF} END {for (i in sum) print i "\t" sum[i]/num[i]}' file | sort -r -k 2