01. 如何获取一个文件每一行的第三个元素?
答案: # awk '{print $3}' 文件名 备注:awk支持按列输出,通过内置变量$1,$2,$3…可以单独显示任意列,默认列是以 空格或Tab缩进为 分隔符,也可以使用-F选项指定其他分隔符。
02. Shell函数能解决什么实际问题?
答案: 定义函数的格式: function 函数名{ 代码块 } 函数名(){ 代码块 } 使用函数可以避免代码重复 使用函数可以将大的工程分割为若干小的功能模块,代码的可读性更强
03. 使用awk统计httpd访问日志中每个客户端IP的出现次数?
答案: # awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' /var/log/httpd/access_log 备注:定义数组,数组名称为ip,数字的下标为日志文件的第1列(也就是客户端的IP地址),++的目的 在于对客户端进行统计计数,客户端IP出现一次计数器就加1。END中的指令在读取完文件后执行,通过 循环将所有统计信息输出。
04. 哪些方式可以将标准输出和错误输出重定向到文件?
答案: # 命令 &> 文件名 # 命令 > 文件名1 2> 文件名2 # 命令 > 文件名 2>&1 # 命令 &>> 文件名 # 命令 >> 文件名1 2>> 文件名2 # 命令 >> 文件名 2>&1
05. 正则表达式符号: *、+、?、[]、[^]、{n}分别代表什么含义?
答案: 表示匹配前面的字符出现了任意次(包括0次) 表示匹配前面的字符出现了至少1次(1次或多次) ? 表示匹配前面的字符出现了0次或1次 [] 表示集合,匹配集合中的任意单个字符 [^] 表示对集合取反 {n} 表示精确匹配前面的字符出现了n次
06. Shell中对变量字串进行截取的方式有哪些?
答案: # echo ${变量名:开始位置:长度} #注意,起始位置从0开始 # expr substr $变量名 开始位置 长度 #注意,起始位置从1开始 # echo $变量名 | cut -b 开始位置-结束位置 #注意,起始位置从1开始
07. 使用sed命令如何将文件中所有的大写字母Q转换为小写字母q?
答案: # sed -i 's/Q/q/g' 文件名
08. 执行如下命令会对test.txt文件产生什么样的影响?
# sed -i 's9\945\9\99\98\939g' test.txt
答案: 将test.txt文件中94599替换为9893
09. 工作中你都写过什么脚本?
答案:
监控脚本(监控系统、监控服务、监控硬件信息、监控性能、安全监控等)
系统初始化脚本(创建目录,创建账户,安装软件包,设置权限,修改内核参数等)
一键部署(源码安装脚本)
备份脚本(自动备份数据库,备份网站数据,备份日志,备份配置文件等)
日志分析脚本(分析日志数据,汇总并统计相关信息,如PV、UV等)
10. 编写脚本,用户输入密码,脚本判断密码是否正确,输入正确则 提示正确,连续输入错误密码3次,则报警?
答案:
# vim test.sh #!/bin/bash init=123456 for i in {1..3} do read -p "请输入密码:" pass if [ $pass == $init ];then echo "密码正确" break fi done echo "警告:密码错误"
11. 编写脚本,自动生成一个8位随机密码?
答案:
vim test.sh #!/bin/bash Str="abcdefghijklnmopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345 6789" pass="" for i in {1..8} do num=$[RANDOM%${#Str}] tmp=${Str:num:1} pass+=$tmp done echo $pass
12. 日志过滤? 从日志/opt/bjca3/logs/ca_access.log中截取14点到16点的日志,将截取的日志导入 到/tmp/ca_access.txt中,日志格式如下
[Fri Mar 17 13:59:00 2017] [debug] mod_cmp.c(1600):[client 192.168.97.8] [CMP] CMP_set_status: starting … [Fri Mar 17 13:59:00 2017] [debug] mod_cmp.c(938):[client 192.168.97.8] [CMP] CMP_cu_integer_set: starting … [Fri Mar 17 13:59:00 2017] [debug] mod_cmp.c(957):[client 192.168.97.8] [CMP] CMP_cu_integer_set: ending ok … ……… [Fri Mar 17 16:36:00 2017] [debug] mod_cmp.c(1014):[client 192.168.97.8] [CMP] cu_octet_str_set: starting … [Fri Mar 17 16:36:00 2017] [debug] mod_cmp.c(1037):[client 192.168.97.8] [CMP] cu_octet_str_set: ending ok …
答案:
awk '$4>"13:00:00"&&$4<="16:59:00"' ca_access.log
13. 编写脚本使用ping命令检测一组IP地址判断是否处于活跃状态。 要求(range:192.168.1.200-192.168.1.220,一个IP发送4个ping包,ping的过程不能输出信息到终 端)?
答案:
#!/bin/bash for i in {200..220} do ping -c 4 -i 0.2 -W 1 192.168.1.$i &>/dev/null if [ $? -ne 0 ];then echo "192.168.1.$i is down" fi done
14.如何查看httpd访问日志文件access.log中哪个IP访问最多?
答案:
awk '{ip[$1]++} END{for(i in ip) {print i,ip[i]}}' /var/log/httpd/access_log | sort -nr
15. 说出 awk 打印/etc/passwd 最后两列的命令怎么写?sed里A 替换成B命令怎么写?
答案:
# awk ‘{print $NF,$(NF-1)}’ /etc/passwd # sed ‘s/A/B/’ /etc/passwd
16.使用sed命令将下文data.txt第2至4行中包含dog字符替换成cat
the lazy dog the lazy dog the lazy dog the lazy fish the hot dog
答案:
# sed -i '2,4s/dog/cat/' data.txt
17.如何删除文本中的空格?
答案:
# sed -i 's/ //g' 文件名