面试题|Shell面试题

目录

1.shell中定义局部变量
2.在执行脚本时bash和source的区别
3.哪些方式可以将标准输出和错误输出重定向到文件?
4.正则表达式符号*、+、?、[]、[^]、{n} 分别代表什么含义?
5.日志切割脚本
6.利用shell开发rsync服务启动、停止脚本,并通过chkconfifig 进行开关机管理
7.编写一个shell脚本,添加100个新用户,并设置密码
8.取出某个文件的第三列,以冒号分割
9.查看access.log文件中某个时间段的日志
10.查看 Apache并发请求数及其TCP连接状态
11.通过APACHE访问日志access.log统计IP和每个地址访问的次数,列出访问量前10名的IP地址,写出具体命令
12.编写脚本实现将/usr/local/test目录下大于100K文件,将它拷贝到/tmp目录下
13.如何获取一个文件每一行第三个元素?
14.使用awk统计httpd访问日志中每个客户端IP出现的次数?
15.编写脚本,用户输入密码,脚本判断密码是否正确,输入正确则提示正确,连续输入错误密码3次,则报警?
16.编写脚本,自动生成一个8位随机密码
17.统计ip访问情况,要求分析nginx访问日志,找出访问页面数量在前十位的ip
18.怎么查看当前系统中每个IP的连接数:
19.python多线程的局限性
20.python的基本数据类型
1.shell中定义局部变量

定义局部变量可以使用local,多在函数中应用
1)shell中定义的变量都是global的,其作用域从被定义的地方开始,到shell结束或被显示删除的地方为止
2)函数定义的变量是可以被定义成local的,其作用域只限于函数内
2.在执行脚本时bash和source的区别
1、source命令用法:
source 文件名
作用:在当前bash环境下读取并执行FileName中的命令。该fifilename文件可以无"执行权限"
注:该命令通常用命令“.”来替代。
source(或点)命令通常用于重新执行刚修改的初始化文档。
source命令(从 C Shell 而来)是bash shell的内置命令。
点命令,就是个点符号,(从Bourne Shell而来)。
source的程序主体是bash,脚本中的$0变量的值是bash,而且由于作用于当前bash环境,脚本中set的变量将直接起效
2、sh,bash的命令用法:
sh/bash 文件名
作用:打开一个子shell来读取并执行FileName中命令。该fifilename文件可以无"执行权限"
注:运行一个shell脚本时会启动另一个命令解释器.
每个shell脚本有效地运行在父shell(parent shell)的一个子进程里.
这个父shell是指在一个控制终端或在一个xterm窗口中给你命令指示符的进程.
shell脚本也可以启动他自已的子进程.这些子shell(即子进程)使脚本并行地,有效率地地同时运行脚本内的多个子任务. 在ubuntu中sh只是bash的一个链接。由于是在子shell中执行,脚本设置的变量不会影响当前shell。
3、./的命令用法:
./文件名
作用:打开一个子shell来读取并执行FileName中命令。该fifilename文件需要"执行权限"
注:运行一个shell脚本时会启动另一个命令解释器.
每个shell脚本有效地运行在父shell(parent shell)的一个子进程里.
这个父shell是指在一个控制终端或在一个xterm窗口中给你命令指示符的进程.
shell脚本也可以启动他自已的子进程.
这些子shell(即子进程)使脚本并行地,有效率地地同时运行脚本内的多个子任务.由于是在子shell中执行,脚本设置的变量不会影响当前shell。
3.哪些方式可以将标准输出和错误输出重定向到文件?
命令 &> 文件名
命令 > 文件名1 2> 文件名2
命令 > 文件名 2>&1
命令 &>> 文件名命令 >> 文件名1 2>> 文件名2
命令 >> 文件名 2>&1
4.正则表达式符号*、+、?、[]、[^]、{n} 分别代表什么含义?
* 表示匹配的前面的字符出现了任意次(包括0次)
表示匹配的前面的字符出现了至少1次(1次或多次)
? 表示匹配前面的字符出现了0次或1次
[] 表示集合,匹配集合中的任意单个字符
[^] 表示对集合取反
{n} 表示精确匹配前面的字符出现了n次
5.日志切割脚本
[root@localhost ~]# vim /usr/local/nginx/logbak.sh #新建脚本名为
logbak.sh
\#!/bin/bash #解释器
date=`date +%Y%m%d` #自定义date变量,值等于当前日期
logpath=/usr/local/nginx/logs #自定义logpath变量,值等于
Nginx日志所在路径
mv $logpath/access.log $logpath/access-$date.log #把当前access日志重命名
mv $logpath/error.log $logpath/error-$date.log #把当前error日志重命名
kill -USR1 $(cat $logpath/nginx.pid) #向nginx主进程发USR1信
号,重新打开生成日志文件,如不发送USR1,Nginx将会继续写入改名之后的日志
接下来把写好的脚本写入计划任务,自动执行。
[root@localhost ~]# crontab -e #打开计划任务表
01 02 * * 6 /usr/local/nginx/logbak.sh #每周六凌晨2:01运行脚本进行
日志切割
6.利用shell开发rsync服务启动、停止脚本,并通过chkconfifig 进行开关机管理
[root@localhost ~]# vim RSstart.sh
#!/bin/bash
case "$1" in
start)
rsync --daemon ## 以守护进程的方式传输数据
if [ $? -eq 0 ]; then
action "rsync is started" /bin/true
else
action "rsync is started" /bin/false
fi ; ;
stop)
pkill rsync sleep 2
if [ `ps -ef|grep rsync|grep -v grep |wc -l` -eq 0 ]; then
action "rsync is stoped " /bin/true
else
action "rsync is stoped " /bin/false
fi ; ;
restart)
pkill rsync sleep 2
if [ `ps -ef|grep rsync|grep -v grep |wc -l` -eq 0 ]; then
rsync --daemon
if [ $? -eq 0 ]; then
action "rsync is restarted" /bin/true
fi
fi ; ;
*)
echo "USAGE :{start|stop|restart}" ; ;
esac
配置开关机管理
然后在脚本最前面加上以下内容
\# chkconfig: 2345 21 99
\# description: chkconfig rsync service
具体自己测试下,也有可能这个启动,关闭序号有冲突,需要修改
7.编写一个shell脚本,添加100个新用户,并设置密码
#!/bin/bash
for name in $(cat $1) # 存放用户的文件列表
do
useradd $name &> /dev/null
stty -echo
echo "0123456" | passwd --stdin $name
stty echo
echo "$1 用户创建成功"
done
8.取出某个文件的第三列,以冒号分割
awk -F ':' '{print $3}' 文件名 | sort -n | uniq -C
9.查看access.log文件中某个时间段的日志
sed -n '起始时间 , 结束时间/p' access.log
10.查看 Apache并发请求数及其TCP连接状态
查看Apache的并发请求数及其TCP连接状态:
Linux命令:
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
11.通过APACHE访问日志access.log统计IP和每个地址访问的次数,列出访问量前10名的IP地址,写出具体命令
awk ‘{print $1}’ access.log|uniq -c|sort -rn |head -10
12.编写脚本实现将/usr/local/test目录下大于100K文件,将它拷贝到/tmp目录下
[root@localhost ~]# vim test_cp.sh
#!/bin/bash
for file in `ls /usr/local/test`
do
if [ -f $file ]; then
if [ `ls -l $file`|awk '{print $5}' -gt 10000]; then
mv $file /tmp/
fi
fi
done
13.如何获取一个文件每一行第三个元素?
awk '{print $3}' 文件名
awk支持按列输出,通过内置变量 2,$3...可以显示任意列,默认列是一空格或Tab缩进为分隔符,也可以使用-F选项指定其他分隔符
14.使用awk统计httpd访问日志中每个客户端IP出现的次数?
awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' /var/log/httpd/access_log
定义数组,数组名为ip,数字下标为日志文件的第一列(也就是客户端的IP地址),++目的在于对客户端进行统计计数,客户端IP出现一次计数器就加一.END中的指令在读取完文件后执行,通过循环将所有的统计信息输出
15.编写脚本,用户输入密码,脚本判断密码是否正确,输入正确则提示正确,连续输入错误密码3次,则报警?
[root@test ~]# vim test.sh
#!/bin/bash
init=123456
for i in {1..3}
do
read -p "请输入密码:" pass
if [ init ]; then
echo "密码正确"
exit
fi
done
echo "警告:密码输入错误"
[root@repo ~]# bash test.sh
请输入密码:789456
请输入密码:4857
请输入密码:46584
警告:密码输入错误
[root@repo ~]# bash test.sh
请输入密码:123456
密码正确
16.编写脚本,自动生成一个8位随机密码
[root@repo ~]# vim test1.sh#!/bin/bash
str="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
pass=""
for i in {1..8}
do
num= {#str}]
tmp=${str:num:1}
pass+=$tmp
done
echo $pass
[root@repo ~]# bash test1.sh
fI55Qcr0
[root@repo ~]# bash test1.sh
iTmEyE9Q
[root@repo ~]# bash test1.sh
wy0PvcHa
[root@repo ~]# bash test1.sh
nk6AC9VT
17.统计ip访问情况,要求分析nginx访问日志,找出访问页面数量在前十位的ip
cat access.log | awk ‘{print $1}’ | uniq -c | sort -rn | head -10
18.怎么查看当前系统中每个IP的连接数:
# netstat -n | awk '/^tcp/ {print $5}' | awk -F: '{print $1}' | sort | uniq -c| sort –rn
sort命令:进行排序,-r 反向排序 -n 使用纯数字进行排序
uniq 将重复的数据仅仅列出一个来显示,uniq -c,进行计数
awk -F: '{print $1}' 以F 为分界符,取出第一个:之前的数据
19.python多线程的局限性
Python代码的执行由Python虚拟机(解释器)来控制。Python在设计之初就考虑要在主循环
中,同时只有一个线程在执行,就像单CPU的系统中运行多个进程那样,内存中可以存放多个程序,但任意时刻,只有一个程序在CPU中运行。同样地,虽然Python解释器可以运行多个线程,只有一个线程在解释器中运行。
对Python虚拟机的访问由全局解释器锁(GIL)来控制,正是这个锁能保证同时只有一个线程在运行。在多线程环境中,Python虚拟机按照以下方式执行。
1.设置GIL。
2.切换到一个线程去执行。
3.运行。
4.把线程设置为睡眠状态。
5.解锁GIL。
6.再次重复以上步骤。
20.python的基本数据类型
【面试题|Shell面试题】数字 字符串 列表 元组 字典

    推荐阅读