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.在执行脚本时bashsource的区别

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的基本数据类型

数字 字符串 列表 元组 字典

你可能感兴趣的