体会bash脚本编程思维

本文介绍了解决一个面试题的方法:通过编写bash脚本来找出一个包含大量IP地址的文件中重复出现次数最多的IP地址。提供了两种实现方案,一种是通过排序和遍历文件,另一种则利用了uniq命令简化流程。
 

事情起因于一个面试题:

一个文件(data.txt)有很多IP地址,每一行一个IP地址,有很多重复的IP地址。写一脚本找出重复最多的IP地址个数?

我的解决思路:先排序,然后遍历所有行,计算出重复次数最多的行。

代码(cal.sh):

#! /bin/bash

sort $1 > ./tmp.txt

max=0
count=0
pre=$(head -1 tmp.txt)

for curr in $(cat tmp.txt)
do
	if [ "$pre" = "$curr" ] ; then
		count=$(($count+1))
		if [ "$max" -lt "$count" ]; then
			max=$count
		fi
	else
		pre=$curr
		count=1
	fi
done

rm ./tmp.txt

echo "$max"

脚本使用方法:cal.sh data.txt

在提示linux下有个命令uniq -c的作用后,bash脚本就简单多了:

#! /bin/bash

sort $1 | uniq -c | sort | tail -1
注:uniq -c的作用是去除连续的重复行,同时在行首显示连续重复行的个数。


相比较两套代码,可以深刻体会到:熟悉常用命令的功能,利用命令的巧妙组合完成特定任务,效率往往要高很多。

写实验心得,以下为实验内容:1. 编写一个shell脚本,它带一个命令行参数,这个参数是一个文件。如果这个文件 是一个普通文件,则打印文件所有者的名字和最后的修改日期。如果程序带有多个 参数,则输出出错信息。 2. 编写一个bash脚本程序,用for循环实现将当前目录下的所有.c文件移到指定的目 录下,最后在显示器上显示指定目录下的文件和目录。 3. 编写一个名为dirname的脚本程序,它将参数作为一个路径名,并将该路径前缀(不 包含最后部分的整个串)写到标准输出。 4. 编写一个累加器脚本程序,用Fiboracci数列的前10个数做参数。 5. 写一个shell脚本,包含两个数字数组array1和array2,分别初始化为{1,2,3,4, 5}和{1,4,9,16,25}。脚本生成并显示一个数组,其中的元素是这两个数组中 对应元素的和,数组中第一个元素是1+1=2,第2个元素是2+4=6等。 6. 某工厂产管理员hnsd负责统计各车间产品数据,计算机安装双硬盘保证数据安全。 该管理员每天上午12:00和下午17:30必须对数据进行双硬盘备份,需要备份的 数据存放于/home/hnsd/workdata/目录,备份数据别存放于/home/hnsd/disk1backup/ (第一块硬盘)和/dev/disk2backup/(第二块硬盘)目录,且文件名形式为 yyyymmdd_workdata1.tar.gz(上午备份文件)和 yyyymmdd_workdata2.tar.gz(下午 备份文件)其yyyy、mm、dd别月 (1) 设计shell程序实现该任务 (2) 编写crontab文件实现述任务自调度 【提示】获取格式yyyymmdd前期: 1)别获取月进行组合 yyyy=`date +%Y` mm=`date +%m` dd=`date +%d` 则$yyyy$mm$dd即文件名前期部 2)直接获取格式yyyymmdd前期 yyyymmdd=`date +%Y%m%d` 则$yyyymmdd即文件名前期部
03-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值