几个shell脚本的面试题(一)

本文介绍了两个Shell脚本面试题目,包括计算文件中IP数量及差异,以及用户名出现次数和对应IP。通过diff、uniq、wc等命令进行文件操作,并给出了部分解决方案。

1. IpCount


如题:

某个目录下有两个文件a.txt和b.txt,文件格式为(ip username),例如:

a.txt
127.0.0.1 zhangsan
127.0.0.1 wangxiaoer
127.0.0.2 lisi
127.0.0.3 wangwu    

b.txt
127.0.0.4 lixiaolu
127.0.0.1 lisi

每个文件至少有100万行,请使用linux命令行完成如下工作:

1)两个文件各自的ip数,以及总ip数
2)出现在b.txt而没有出现在a.txt的ip
3)每个username出现的次数,以及每个username对应的ip数
1.1 计算两个文件各自的ip数,以及总ip数

思路分析:

  • 分别从两个文件中截取第一个字段,然后通过uniq命令去除重行,分别输入到ipA.txt和ipB.txt文件中
cat a.txt | awk ‘{
  
  print $1}’ | sort | uniq > ipA.txt
cat b.txt | awk ‘{
  
  print $1}’ | sort | uniq > ipB.txt
  • 然后只要计算ipA和ipB文件的行数就可以了,这里使用wc命令,参数为 -l,表示出现的line数
wc -l ipA.txt
wc -l ipB.txt
  • 这时我们只是分别计算出了a.txt 和 b.txt 的ip数,总的ip数需要再去重一次
cat ipA.txt ipB.txt > ip.txt
sort -u ip.txt | wc -l

所以,根据这些片段,我们可以把它组装成以个脚本,实现自动化^&^

当然,我们直接拿上面的语句拼装一下就可以了。

#! /bin/bash

cat a.txt | awk '{print $1}' | sort | uniq > ipA.txt

cat b.txt | awk '{print $1}' | sort | uniq > ipB.txt
<think>嗯,用户想了解Shell脚本常见的面试题,我需要好好整理下。首先,得确定常见的考点有哪些。Shell脚本面试题通常涉及基础语法、变量处理、流程控制、文本处理、系统命令、调试和实际脚本编写这几个方面。 先从基础问题开始。用户可能被问到如何定义变量,变量赋值和使用时的注意事项,比如等号两边不能有空格。还有如何传递参数,像$1、$2这些位置参数,以及$#、$*、$@的区别。单引号和双引号的区别也是常见的,单引号不转义,双引号可以解析变量。 然后是条件判断,比如用test或者[ ],注意空格的问题。还有循环结构,for和while循环的写法,以及case语句的用法。这些流程控制结构在脚本中经常用到,必须掌握。 接下来是文本处理相关的问题。grep、sed、awk这些命令的使用场景,比如查找特定内容、替换文本、处理字段。读取文件行的常用方法,使用while循环和read命令,避免用for循环因为空格问题。还有如何比较字符串、数字,处理文件是否存在等检查。 系统命令方面,可能会问如何获取进程ID,检查上条命令是否成功,通过$?来判断。查找文件可以用find,排序用sort,去重用uniq,计算行数用wc。这些命令在脚本中组合使用,处理实际问题。 调试和错误处理也是重点。比如如何调试脚本,用set -x或者bash -x。处理脚本中的错误,用set -e让脚本遇到错误立即退出,或者使用trap捕获信号。还有如何判断文件是否可读、可写,检查变量是否设置,避免脚本出错。 实际脚本编写题,比如遍历目录、备份文件、监控进程、统计日志等。这类问题需要综合运用前面的知识,写出结构清晰的脚本。比如备份文件可能需要用日期做文件名,tar命令压缩,检查目录是否存在。监控进程可以用ps和grep结合,检查返回值。 还要注意些易错点,比如变量替换时的大括号使用,防止歧义。处理文件名中的空格,需要用引号包裹变量。管道命令中变量作用域的问题,使用子shell或者临时文件传递数据。 用户可能需要例子来理解,所以准备几个典型问题。例如,如何判断个数是否是质数,用循环和取模运算。或者统计日志中每个IP的出现次数,用awk处理。备份目录并保留最近5天的数据,结合find和crontab。 最后,要强调代码的可读性和健壮性,比如添加错误处理,检查命令是否存在,处理异常输入。这些在面试中展示全面考虑问题的能力很重要。</think>以下是Shell脚本常见面试题及核心知识点整理,分模块归纳便于理解: 📌 、基础语法类 1. 变量操作 - 定义变量:`var="value"`(等号两侧不能有空格) - 使用变量:`echo $var` 或 `${var}_suffix` - 特殊变量: - `$0` 脚本名 - `$1`~`$9` 位置参数 - `$#` 参数个数 - `$*` 所有参数(整体字符串) - `$@` 所有参数(数组形式) 2. 引号区别 ```bash name="World" echo 'Hello $name' # 输出 Hello $name echo "Hello $name" # 输出 Hello World ``` 📌 二、流程控制 1. 条件判断 ```bash if [ $a -gt $b ]; then echo "a > b" elif [ $a -eq $b ]; then echo "a = b" else echo "a < b" fi ``` 2. 循环结构 ```bash # for循环 for i in {1..5}; do echo $i done # while读取文件 while read line; do echo $line done < file.txt ``` 📌 三、文本处理高频题 1. 统计日志IP出现次数 ```bash awk '{print $1}' access.log | sort | uniq -c | sort -nr ``` 2. 批量重命名文件 ```bash for file in *.txt; do mv "$file" "new_${file}" done ``` 📌 四、系统操作实战题 1. 进程监控脚本 ```bash #!/bin/bash process_name="nginx" if ! pgrep -x "$process_name" > /dev/null; then systemctl restart $process_name echo "Process restarted" fi ``` 2. 自动备份脚本 ```bash #!/bin/bash backup_dir="/backup" target_dir="/data" [ ! -d $backup_dir ] && mkdir -p $backup_dir tar -czf ${backup_dir}/backup_$(date +%F).tar.gz $target_dir find $backup_dir -type f -mtime +7 -exec rm {} \; ``` 📌 五、调试与错误处理 1. 调试技巧 ```bash # 启用调试模式 set -x # 你的代码 set +x # 严格模式 set -euo pipefail ``` 2. 错误捕获 ```bash trap 'echo "Error at line $LINENO"; exit 1' ERR ``` 💡 高频考点总结: 1. 变量作用域问题(函数内外) 2. 命令替换的两种方式:`` `command` `` 与 `$(command)` 3. 测试表达式:`[[ ]]` vs `[ ]` 4. 文件描述符操作:`2>&1` 错误输出重定向 5. 数组操作:`arr=(a b c)`,`${arr[@]}` 建议练习方向: 1. 编写带参数解析的脚本 2. 实现日志分析工具 3. 创建自动化部署脚本 4. 编写安全的文件处理脚本(处理含空格文件名) 记住:面试时不仅要写出正确答案,更要解释清楚代码的执行逻辑和潜在优化点!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值