sed awk 实例分享

介绍

做运维的应该经常用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值