牛客网和力扣shell编程练习

本文汇总了33个实用的Shell脚本案例,涵盖了文件操作、循环、条件判断、文本处理、日志分析等多个方面,旨在提升Shell脚本处理能力,适用于系统管理员和开发者日常工作中对文本数据的快速处理和分析。

牛客网练习地址

SHELL1 统计文件的行数

wc -l < nowcoder.txt
#or
cat nowcoder.txt | wc -l
#or
awk '{i++}END{print i}' < nowcoder.txt
#or
grep -c '' nowcodet.txt 
grep -c '.*' nowcodet.txt 

SHELL2 打印文件的最后5行

tail -5 nowcoder.txt

SHELL3 输出7的倍数

for i in {0..500}
do
    if (( $i%7==0 ))
    then
        echo $i
    fi
done

#or
for((i=0;i<500;++i))
do
	if (( $i%7==0 ))
	then 
		echo $i
	fi
done

#or
awk 'BEGIN{for(i=0;i<500;++i) if(i%7==0) print i;}'

shell中的范围for循环:for i in {0..500}

i=0
while (($i<=500))
do
    if (($i%7==0))
    then
        echo $i
    fi
    let "i++"
done

SHELL4 输出第5行的内容

head -5 nowcoder.txt | tail -1
#or
sed -n '5p' nowcoder.txt
#or
awk 'NR==5{print $0}' nowcoder.txt

SHELL5 打印空行的行号

grep -n '^$' nowcoder.txt | sed 's#:##g'
#or
awk '/^$/{print NR}' nowcoder.txt

SHELL6 去掉空行

grep -v '^$' nowcoder.txt

#or
grep '.' nowcoder.txt

#or
sed -r '/^$/d' nowcoder.txt

#or
sed -nr '/^$/!p' nowcoder.txt

#or
awk '!/^$/{print $0}' nowcoder.txt

SHELL7 打印字母数小于8的单词

awk '{for(i=1;i<=NF;++i) if(length($i)<8) print $i;}' nowcoder.txt
#or
for i in $(cat nowcoder.txt)
do
   if [ ${#i} -lt 8 ] 
   then
        echo $i
    fi
done

SHELL8 统计所有进程占用内存大小的和

awk '{sum+=$6}END{print sum}' nowcoder.txt

SHELL9 统计每个单词出现的个数

awk '{for(i=1;i<=NF;++i) cnt[$i]++;}END{for(j in cnt) print j,cnt[j];}' nowcoder.txt | sort -nk2

SHELL10 第二列是否有重复

awk '{cnt[$2]++}END{for(i in cnt) if(cnt[i]>1) print cnt[i],i}' nowcoder.txt

SHELL11 转置文件的内容

awk '{
        for(i = 1; i <= NF; ++i){
            if(NR == 1){
                arr[i] = $i;
            }else{
                arr[i] = arr[i]" "$i;
            }
        }    
    }END{
        for(i in arr){
            print arr[i];
        }
    }' nowcoder.txt

SHELL12 打印每一行出现的数字个数

awk 'BEGIN{
         FS="";
     }
     {
        for(i=1;i<=NF;++i){if($i~/[1-5]/) cnt++;}
        printf("line%d number: %d\n",NR,cnt);
        sum+=cnt;
        cnt=0;
     }
     END{
        printf("sum is %d\n",sum);
      }' nowcoder.txt

SHELL13 去掉所有包含this的句子

grep -v 'this'

#or
sed -nr '/this/!p'

#or
sed -r '/this/d'

SHELL14 求平均值

awk '{if(NR==1) num=$0;else sum+=$0}END{printf("%.3f",sum/num);}'

SHELL15 去掉不需要的单词

sed -n '/[bB]/!p'

SHELL16 判断输入的是否为IP地址

awk -F. '{if(NF!=4) print "error";else if($1>255||$2>255||$3>255||$4>255) print"no";else print "yes"}' nowcoder.txt

SHELL17 将字段逆序输出文件的每行

awk -F: '{
	printf("%s",$NF);
	for(i=NF-1;i>0;--i)
		printf(":%s",$i);
	print ""
}' nowcoder.txt

SHELL18 域名进行计数排序处理

awk -F"[/]+" '{cnt[$2]++}END{for(i in cnt) print cnt[i],i}' nowcoder.txt | sort -rnk1

SHELL19 打印等腰三角形

#! /bin/bash

for((i=0;i<5;++i))
do
        for((j=0;j<5+i;++j))
        do
                if ((j<5-1-i))
                then
                        echo -n " "
                elif (((i+j)%2==0))
                then
                        echo -n "*"
                else
                        echo -n " "
                fi
        done
        echo ""
done

SHELL20 打印只有一个数字的行

awk '/(^[0-9]([a-z]+)$)|(^[a-z]*[0-9]$)|(^[a-z][0-9][a-z]$)/' nowcoder.txt
#or
awk -vFS="" '{for(i=1;i<=NF;i++){if($i~/[0-9]/) k++;}if(k==1){print $0}; k=0;}'  nowcoder.txt

SHELL21 格式化输出

awk 'BEGIN{FS=""}
     {
	     for(i=1;i<=NF;++i){
		printf("%s",$i);
		if((NF-i)>0&&(NF-i)%3==0)
		    printf(",");
	     }
	     print ""
    }' nowcoder.txt

SHELL22 处理文本

awk -F: '{a[$1]=a[$1]$2"\n"}END{for(i in a) printf("[%s]\n%s",i,a[i])}' nowcoder.txt

采用拼接字符串的方式处理集合问题:a[$1]=a[$1]$2"\n"


SHELL23 nginx日志分析1-IP统计

awk '/23\/Apr\/2020/{cnt[$1]++}END{for(i in cnt) print cnt[i],i}' nowcoder.txt | sort -rnk1

SHELL24 nginx日志分析2-统计某个时间段的IP

#length()有的地方不支持
awk '/23\/Apr\/2020:20:/,/23\/Apr\/2020:23:/{cnt[$1]++}END{print length(cnt)}' nowcoder.txt
#or
awk '/23\/Apr\/2020:20:/,/23\/Apr\/2020:23:/{cnt[$1]++}END{for(i in cnt) res++;print res}' nowcoder.txt
#or
awk '/23\/Apr\/2020:2[0-2]/{cnt[$1]++}END{for(i in cnt) res++;print res}' nowcoder.txt

SHELL25 nginx日志分析3-统计访问3次以上的IP

awk '{cnt[$1]++}END{for(i in cnt) if(cnt[i]>3) print cnt[i],i;}' nowcoder.txt | sort -rnk1

SHELL26 nginx日志分析4-查询某个IP的详细访问情况

grep '192.168.1.22' nowcoder.txt | awk '{cnt[$7]++}END{for(i in cnt) print cnt[i],i;}' | sort -rnk1
#or
awk '/192.168.1.22/{cnt[$7]++}END{for(i in cnt) print cnt[i],i;}' nowcoder.txt | sort -rnk1

SHELL27 nginx日志分析5-统计爬虫抓取404的次数

grep 'spider.html' nowcoder.txt | grep '404' | wc -l
#or
awk '$NF~/spider.html/' nowcoder.txt | awk '$9~/404/{cnt++} END{print cnt}'
#awk的条件是支持与逻辑的
awk '$9~/404/ && $NF~/spider.html/ {cnt++} END{print cnt}' nowcoder.txt

SHELL28 nginx日志分析6-统计每分钟的请求数

awk -F: '{cnt[$2":"$3]++}END{for(i in cnt) print cnt[i],i}' nowcoder.txt | sort -rnk1

SHELL29 netstat练习1-查看各个状态的连接数

awk '{if($NF~/ESTABLISHED/ || $NF~/LISTEN/ || $NF~/TIME_WAIT/) cnt[$NF]++;}END{for(i in cnt) print i,cnt[i];}' nowcoder.txt | sort -rnk2
#or
awk 'NR>1{if($NF~/[A-Z]+/) cnt[$NF]++;}END{for(i in cnt) print i,cnt[i];}' nowcoder.txt | sort -rnk2

SHELL30 netstat练习2-查看和3306端口建立的连接

awk 'NR>1{print $5}' nowcoder.txt | awk -F: '{if($2==3306) cnt[$1]++;}END{for(i in cnt) print cnt[i],i}' | sort -rnk1

SHELL31 netstat练习3-输出每个IP的连接数

awk 'NR>1{if($1=="tcp") print $5;}' nowcoder.txt | awk -F: '{cnt[$1]++}END{for(i in cnt) print i,cnt[i]}' | sort -rnk2

SHELL32 netstat练习4-输出和3306端口建立连接总的各个状态的数目

awk 'NR>1{if($1 == "tcp") print $5}' nowcoder.txt |
awk -F: '{if($2==3306) {
            total_link++;
            ip[$1]++;
          }}
          END{print "TOTAL_IP",length(ip);
              print "ESTABLISHED",total_link;
              print "TOTAL_LINK",total_link;
          }'

SHELL33 业务分析-提取值

awk -F"log " '{print $NF}' nowcoder.txt |
awk -F":|," -vOFS=: '{
                        switch(NR){
                                case 1 : print "serverVersion",$2;break;
                                case 3 : print "serverName",$2;break;
                                case 4 : print "osName",$2;print "osVersion",$4;break;
                                default: break;
                        }
                     }'

SHELL34 ps分析-统计VSZ,RSS各自总和

awk 'NR>1{vsz+=$5;rss+=$6;}END{print "MEM TOTAL";print "VSZ_SUM:"vsz/1024"M,""RSS_SUM:"rss/1024"M"}' nowcoder.txt

VSS:为进程分配的虚拟内存的大小
RSZ:resident set size,常驻内存集大小,表示物理内存的大小


192 统计词频

awk 'BEGIN{} {
		for (i = 1; i <=NF; ++i) {
			cnt[$i]++;
		}
	} END {
		for (i in cnt) {
			print i, cnt[i];
		}
	}' words.txt | sort -rnk2

192 有效电话号码



192 转置文件



192 第十行

sed -n '10p' file.txt

#or
awk 'NR==10{print $0}'

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值