shell 常见面试题及答案(3)

来源:互联网 发布:linux gcc 4.8.5 编辑:程序博客网 时间:2024/06/05 17:36

本文接 《shell 常见面试题及答案(2)》

四、

1.如何取得文件/etiantian的权限对应的数字,如-rw-r--r-- 为644,取得644这样的数字。
解答:

Loong:/home/yee/shell# stat -c %a calculate_birthday.sh777
知识点:

stat

STAT(1)                                 User Commands                                STAT(1)

NAME
       stat - display file or file system status                                       显示文件或文件系统状态

SYNOPSIS
       stat [OPTION] FILE...

DESCRIPTION
       Display file or file system status.

       -L, --dereference
              follow links

       -f, --file-system
              display file system status instead of file status   显示文件系统状态

       -c  --format=FORMAT
              use  the  specified FORMAT instead of the default; output a newline after each
              use of FORMAT
                    用指定的格式代替默认值,输出到新行

       --printf=FORMAT
              like --format, but interpret backslash escapes, and do not output a  mandatory
              trailing newline.  If you want a newline, include \n in FORMAT.

       -t, --terse
              print the information in terse form         简洁形式输出

       --help display this help and exit

     --version
              output version information and exit

       The valid format sequences for files (without --file-system):

       %a     Access rights in octal                用8进制的形式表示权限

Loong:/home/yee/shell# stat -c %a calculate_birthday.sh 777
       %A     Access rights in human readable form           可读型表示法

Loong:/home/yee/shell# stat -c %A calculate_birthday.sh -rwxrwxrwx

       %b     Number of blocks allocated (see %B)

       %B     The size in bytes of each block reported by %b

       %C     SELinux security context string

       %d     Device number in decimal

       %D     Device number in hex

       %f     Raw mode in hex

       %F     File type

       %g     Group ID of owner

       %G     Group name of owner

       %h     Number of hard links

       %i     Inode number

       %n     File name

       %N     Quoted file name with dereference if symbolic link

       %o     I/O block size

       %s     Total size, in bytes

       %t     Major device type in hex

       %T     Minor device type in hex

       %u     User ID of owner

       %U     User name of owner

       %x     Time of last access

       %X     Time of last access as seconds since Epoch

       %y     Time of last modification

%z     Time of last change

       %Z     Time of last change as seconds since Epoch

       Valid format sequences for file systems:

       %a     Free blocks available to non-superuser

       %b     Total data blocks in file system

       %c     Total file nodes in file system

       %d     Free file nodes in file system

       %f     Free blocks in file system

       %C     SELinux security context string

       %i     File System ID in hex

       %l     Maximum length of filenames

       %n     File name

       %s     Block size (for faster transfers)

       %S     Fundamental block size (for block counts)

       %t     Type in hex

       %T     Type in human readable form

       NOTE:  your shell may have its own version of stat, which usually supersedes the ver-
       sion described here.  Please refer to your shell's documentation  for  details  about
       the options it supports.

应用举例:
Loong:/home/yee/shell# stat practise1.sh
  File: “practise1.sh”
  Size: 144           Blocks: 8          IO Block: 4096   普通文件
Device: 806h/2054d    Inode: 3776576     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2012-11-01 15:23:00.000000000 +0800
Modify: 2012-11-01 15:20:55.000000000 +0800
Change: 2012-11-01 15:20:55.000000000 +0800

可以详细列出文件的大小,块及节点,建立修改时间等

Loong:/home/yee/shell# stat test
  File: “test”
  Size: 4096          Blocks: 8          IO Block: 4096   目录
Device: 806h/2054d    Inode: 3776522     Links: 2
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2012-11-01 15:45:46.000000000 +0800
Modify: 2012-11-01 15:23:00.000000000 +0800
Change: 2012-11-01 15:23:00.000000000 +0800

目录也适用。

2.linux下通过mkdir命令创建一个新目录/mianwww/ett,它的硬链接数是多少,为什么?
解答:

硬链接的定义

  Linux 文件系统最重要的特点之一是它的文件链接。链接是对文件的引用,这样您可以让文件在文件系统中多处被看到。不过,在 Linux 中,链接可以如同原始文件一样来对待。链接可以与普通的文件一样被执行、编辑和访问。对系统中的其他应用程序而言,链接就是它所对应的原始文件。当您通过链接对文件进行编辑时,您编辑的实际上是原始文件。链接不是副本。有两种类型的链接:硬链接和符号链接(软链接)。

  硬链接只能引用同一文件系统中的文件。它引用的是文件在文件系统中的物理索引(也称为 inode)。当您移动或删除原始文件时,硬链接不会被破坏,因为它所引用的是文件的物理数据而不是文件在文件结构中的位置。硬链接的文件不需要用户有访问原始文件的权限,也不会显示原始文件的位置,这样有助于文件的安全。如果您删除的文件有相应的硬链接,那么这个文件依然会保留,直到所有对它的引用都被删除。

Loong:/home/yee/shell/test1# ls -ial
总计 8
3776564 drwxr-xr-x 2 root root 4096 11-02 14:08 .
3776513 drwxr-xr-x 6 root root 4096 11-29 10:29 ..

每个文件和目录都是有两部分构成,inode和data block

硬链接使用一个inode ,可以用ls -i  查看 i(inode)请注意文件属性后面数字代表被链接的次数
这两个文件名字只是不同的入口 ,进入相同的内容。所以硬链接不能链接目录 。
软链接是另外一个文件 ,使用不同的inode

存储文件的时候例如dir1里存着两个硬连接文件file1和file2file1和file2的inode是相同的,dir1自身有一个innode,这个inode指向的data block里存着file1和file2两个文件的指向,这两个指向是相同的,都指向一个innode

3.请执行命令取出linux中eth0的IP地址(请用cut,有能力者也可分别用awk,sed命令答)。
解答:

yee@Loong:~$ ifconfig |head -n 2|tail -1|cut -c 21-32172.16.3.62 yee@Loong:~$ 
yee@Loong:~$ ifconfig |awk "/addr:/"|head -n 1|awk 'BEGIN {FS=" "}{ print $2}'addr:172.16.3.62

4.请给出默认情况eth0网卡配置文件的路径及客户端DNS的路径。
解答:
客户端DNS的路径

/etc/resolv.conf

eth0网卡配置文件的路径

/etc/sysconfig/network-scripts/ifcfg-eth0

1.配置文件
/etc/hosts(本地主机ip地址映射,可以有多个别名)。
/etc/services(端口号与标准服务之间的对应关系)。

/etc/sysconfig/network(设置主机名,网关,域名)。
HOSTANME=zjw.com(主机名)(需要重启计算机才有效)
GATEWAY=192.168.1.1(网关)

/etc/rc.d/init.d/network restart(脚本服务启动)
service network restart(同上,是命令执行)

2.和DNS相关
/etc/host.conf
/etc/nsswitch.conf
/etc/resolv.conf(配置dns)

3.网卡配置文件
/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0(哪张网卡)
ONBOOT=yes
BOOTPROTO=static(静态ip状态设置)
BOOTPROTO=dhcp(dhcp获取)
IPADDR=192.168.1.8(静态ip地址)
NETMASK=255.255.255.0
GATEWAY=192.168.1.1(网关)(如果在此设置网关,则上面的无效)
MACADDR=00:0C:29:96:38:F8(修改mac地址)(永久有效)
/etc/rc.d/init.d/network restart(脚本启动)
service network restart(命令启动)

4.IP配置方法及自动获取ip
ifconfig eth0 192.168.0.10 将采用默认子网掩码
ifconfig eth0 192.168.0.10 netmask 255.255.255.252 (手动定义子网掩码)
ifconfig eth0 up(激活网卡)

/etc/sysconfig/network-scripts/ifup eth0(脚本激活网卡)或者
ifup eth0(指向/sbin/ifup的符号链接)。注:修改mac地址,用此好像无效,切记。

ifconfig eth0 down(关闭网卡)
/etc/sysconfig/netowrk-scripts/ifdown eth0(脚本关闭网卡)或者
ifdown eth0(指向/sbin/ifdown的符号链接)

netconfig
是文本窗口的形式设置IP的命令,修改好之后用
service network restart (让配置参数生效)

ifconfig eth0 -dynamic(手动设置获取dhcp ip地址)

5.修改MAC地址
ifconfig eth0 down
ifconfig eth0 hw ether 00:00:0c:12:34:56
/etc/rd.d/init.d/network(上面的修改可存储在此脚本中)
ifconfig eth0 up
#上面这种方法是在内核中修改,下次开机将还原
要永久有效在网卡配置文件中加入以下这一条:
MACADDR=00:00:0c:12:34:56
/etc/sysconfig/network-scripts/ifcfg-eth0

6.常用测试命令
ping -c 4 172.16.1.1
route (对内核的ip路由表进行操作,主要对己配置的接口的主机或网络设置静态路由,如通过ifconfig程序配)
route add -net 192.168.1.0 netmask 255.255.255.0 eth0 (添加一条到192.168.1.0网络的路由条目)
route del -net 192.168.1.0 netmask 255.255.255.0 (删除路由条目)
route -C 查看缓冲表
route -n 查看本地路由表
traceroute 路由跟踪
注:netconfig、ifconfig、route三者结合使用,不用重启系统及服务。

5.查找当前目录下所有文件,并把文件中的www.mianwww.com字符串替换成rainman
解答思路:

  1 #!/bin/bash  2   3   4 for line in `ls `  5 do  6         #对文件内的特定字符进行替换  7          8 done

单个文件处理字符替换:sed

yee@Loong:~/shell$ cat du.txt 957./test_practise.sh503./full-name-output.sh1386./passwd181./self_add2.sh14./deal_passwd.sh
Loong:/home/yee/shell# sed -e 's/passwd/com/' du.txt   将passwd替换成com957./test_practise.sh503./full-name-output.sh1386./com181./self_add2.sh14./deal_com.shLoong:/home/yee/shell# 

6.问题:如何赋予mianwww文件 -rw-r--r-x权限属性
解答:

该权限分成3部分:只需通过root或所有者利用chmod更改即可;

rw-                读写  ----4+2 = 6

-r-                  读     -----4

r-x                 读执行 ------4+1 = 5

chmod 645 file 即可更改;

Loong:/home/yee/shell# ls -l du.txt -rw-r--r-- 1 root root 102 11-29 15:22 du.txtLoong:/home/yee/shell# chmod 645 du.txt Loong:/home/yee/shell# ls -l du.txt -rw-r--r-x 1 root root 102 11-29 15:22 du.txtLoong:/home/yee/shell# 

7.执行下面命令时发现提示需要输入密码,请问提示输入的密码是哪个用户的密码。
[test@mianwww ~]$ sudo su - mianwww

解答:

su -   : 切换到 rootsudo su - : 以 root 身份执行 su - 命令不管你以什么身份执行 su - 命令,结果都是一样的,所以 sudo su - 没意义,直接 su - 即可密码应该是root 用户的
8.问题:请问在一个命令上加什么参数可以实现下面命令的内容在同一行输出。
echo "mianwww";echo "mianwww"
解答:
Loong:/home/yee/shell# echo -n "mianwww";echo "mianwww"mianwwwmianwww
加参数 -n 不换行
Loong:/home/yee/shell# echo -e '\tmianwww'mianwww
另外,加参数 -e 使用转义字符

9.问题:请给出如下格式的date命令 例:11-02-26
解答:
Loong:/home/yee/shell# date +%y-%m-%d12-11-29

10.实现按周输出 比如:周六 输出为 6
解答:
Loong:/home/yee/shell# date +%A星期四Loong:/home/yee/shell# date +%A%u星期四4Loong:/home/yee/shell# date +%u4

11.问题:扩展问题:打印三天前时间,日期格式如:2011-02-26

解答:
Loong:/home/yee/shell# date +%F              可惜是3天前的,不能这样做2012-11-29
3天前的时间比较复杂,有几种特殊情况,前三天是另一年,另一个月,这样不能单独计算,不晓得有没有在date +%s上减去3天的24*60*3 时间再换算的显示方法,若有则比较简单,你有啥方法呢?

12.已知/mianwww/test.txt文件内容为:

mianwww

xizi

xiaochao
请问如何把文件中的空行过滤掉(要求命令行实现)。
解答:grep -v "^\s*$" /mianwww/test.txt

Loong:/home/yee/shell# cat du.txt test_practise.shfull-name-output.sh1386./passwd/self_add2.sh14./deal_passwd.shLoong:/home/yee/shell# grep -v "^\s*$" du.txt test_practise.shfull-name-output.sh1386./passwd/self_add2.sh14./deal_passwd.shLoong:/home/yee/shell# 


13-14.请描述下列路径的内容是做什么的?
/var/log/message  

所有的开机系统发生的错误都会在此记录;
/var/log/secure

1)/var/log/secure:记录登录系统存取数据的文件;
例如pop3,ssh,telnet,ftp等都会记录在此

/var/spool/clientmqueue

logwatch生成的日志mail文件
/proc/interrupts

列出了当前系统定义的所有硬中断
/etc/fstab

/etc/fstab存放的是系统中的文件系统信息;它是决定一个硬盘(分区)被怎样使用或者说整合到整个系统中的唯一文件。fstab可以自动挂载各种文件系统格式的硬盘、分区、可移动设备和远程设备等

/proc/interrupts文件中列出当前系统使用的中断的情况,所以某个中断处理没有安装,是不会显示的。哪怕之前安装过,被卸载了。

从左到右分别是,

irq的序号, 在各自cpu上发生中断的次数,可编程中断控制器,设备名称(request_irq的dev_name字段)

$cat /proc/interrupts
           CPU0       CPU1      
  0: 2822434225          0    IO-APIC-edge  timer
  1:         12         45    IO-APIC-edge  i8042

补充:

1)/var/log/secure:记录登录系统存取数据的文件;
例如pop3,ssh,telnet,ftp等都会记录在此.

2)/ar/log/wtmp:记录登录这的信息记录,被编码过,所以必须以last解析;

3)/var/log/message:jihu所有的开机系统发生的错误都会在此记录;

4)/var/log.boot.log:记录一些开机或者关机启动的一些服务显示的启动或者关闭的信息;

5)/var/log/maillog:记录邮件的存取和往来;

6)/var/log/cron:用来记录crontab这个服务的内容;

7)/var/log/httpd,/var/log/mysqld.log等等文件,记录几个不同的网络服务的记录文件;

8)/var/log/acpid ,   ACPI - Advanced Configuration and Power Interface,表示高级配置和电源管理接口。
后面的 d 表示 deamon 。 acpid 也就是 the ACPI event daemon 。 也就是 acpi 的消息进程。用来控制、获取、管理 acpi 的状态的服务程序。

9)/var/run/utmp 记录着现在登录的用户;
10)/var/log/lastlog 记录每个用户最后的登录信息;
11)/var/log/btmp 记录错误的登录尝试;
12)/var/log/dmesg内核日志;
13)/var/log/cpus CPU的处理信息;
14)/var/log/syslog 事件记录监控程序日志;
15)/var/log/auth.log 用户认证日志;
16)/var/log/daemon.log 系统进程日志;
17)/var/log/mail.err 邮件错误信息;
18)/var/log/mail.info 邮件信息;
19)/var/log/mail.warn 邮件警告信息;
20)/var/log/daemon.log 系统监控程序产生的信息;
21)/var/log/kern 内核产生的信息;
22)/var/log/lpr   行打印机假脱机系统产生的信息;



五、

1. 如何查看apache进程数

分两个情况

perfork模式:

ps -ef|grep http|grep -v grep|wc -l               通过-v 排除grep 进程

worker模式

pstree -a|grep httpd|wc -l

前者进程模式  后者线程模式 故查看方法也有区别

说明:如果学生答题时,能一分为二的解答 会比一个答案好很多的

2. 处理以下文件内容,将域名取出并进行计数排序,如处理

oldboy.log

http://www.etiantian.org/index.html

http://www.etiantian.org/1.html

http://post.etiantian.org/index.html

http://mp3.etiantian.org/index.html

http://www.etiantian.org/3.html

http://post.etiantian.org/2.html

分析:此类问题是运维工作中最常见的问题。可以演变成分析日志,查看TCP各个状态连接数,查看单IP连接数排名等等

第一类 过滤域名方法

方法很多 这里给出六种 为例。还可以写出几种 留给大家了。哈哈

法一:

[root@oldboy ~]# cut -d “/” -f 3 oldboy.log |sort|uniq -c           cut 截取指定内容

1 mp3.etiantian.org

2 post.etiantian.org

3 www.etiantian.org

法二:

[root@oldboy ~]# awk -F “/” ‘{print $3}’ oldboy.log |sort|uniq -c  截取指定内容

1 mp3.etiantian.org

2 post.etiantian.org

3 www.etiantian.org

法三:

[root@oldboy ~]# sed ‘s/^ htt.*\/\///g’ oldboy.log |sed ‘s/\/.*html$//g’|sort|uniq -c

1 mp3.etiantian.org

2 post.etiantian.org

3 www.etiantian.org

法四:

[root@oldboy ~]# cat oldboy.log |tr “\/” “\n”|grep etiantian|sort|uniq -c

1 mp3.etiantian.org

2 post.etiantian.org

3 www.etiantian.org

第二类:

法五:

[root@oldboy ~]#  cut -d “/” -f 3 test.log|awk ‘{++S[$1]} END {for(key in S) print key,S[key]}’|sort -k 2

mp3.etiantian.org 1

post.etiantian.org 2

www.etiantian.org 3

 

法六:

一个利用AWK数组综合解决方法

[root@oldboy ~]# awk -F “/” ‘{++S[$3]} END {for(key in S) print key,S[key]}’ oldboy.log|sort -k2

mp3.etiantian.org 1

post.etiantian.org 2

www.etiantian.org 3

以上答案 不同组合 已可以达到10多种答案,前面两种还行,后面太复杂,多少有点问题。

 六、

问题1:请通过awk命令取出服务器eth0网卡配置的ip地址(注*:此题可上机操作。目的:考察awk应用)。
解答:
[root@oldboy-A ~]# ifconfig eth0|grep “inet addr”|awk ‘{print $2}’|awk -F”:” ‘{print $2}’
10.0.0.148

 

问题2:通过sed命令将/tmp/old-boy.txt中的/usr/log替换为 /home/oldboy(来自《360公司》面试 from jeacen)
解答:
[root@oldboy-A ~]# cat /tmp/old-boy.txt
/usr/log
oldboy
[root@oldboy-A ~]# sed -e “s#/usr/log#/home/oldboy#” /tmp/old-boy.txt                      “#”在这里是分隔符,代替了默认的“/”分隔符
/home/oldboy
oldboy
[root@oldboy-A ~]# sed -i “s#/usr/log#/home/oldboy#” /tmp/old-boy.txt
[root@oldboy-A ~]# cat /tmp/old-boy.txt
/home/oldboy
oldboy
方法一:sed -i ‘s#\/usr\/log#\/home\/oldboy#’ /tmp/old-boy.txt 等同sed -i ‘s#/usr/log#/home/oldboy#’ /tmp/old-boy.txt

 

sed ‘s#10#100#g’ example—–不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有10替换成100
方法二:sed -i ‘s/\/home\/oldboy/\/usr\/log/’ /tmp/old-boy.txt                关键在转义符使用 \
方法三:sed -i “s#/usr/log#/home/oldboy#” /tmp/old-boy.txt  ==>双引号也可以。
提示:”/”为特殊字符,需要转义,在斜线前面加反斜线来转义。本例中方法一不转义也可以完成。
问题3:通过find搜索/var/log下3天以前的日志并删除
解答:
find /var/log/*.log -mtime +3 -exec rm {} \;
find /var/log/*.log -mtime +3 -type f -exec rm -f {} \;
find /var/log/*.log -type f -mtime +3 |xargs rm -f
提示:
1.有关find的各种详细案例讲解总结请参看〈老男孩笔记系列-find命令实战案例讲解指南〉
2.rm 命令请慎用,本人近10年运维亲身或听别人说过数十次使用该命令造成的无法弥补的后果。

问题4:192.168.0.0网段通过192.168.0.1网关的连入172.16.0.0 ip段,如何添加路由(来自《360》面试 from jeacen)

解答:/sbin/route add -net 172.16.0.0  netmask 255.255.255.0 gw 192.168.0.1
提示:有关route及ip命令的使用,课上将详细讲解。很重要的命令,必须要掌握。

问题5:shell特殊变量中 $?,$#分别表示什么意思?
解答:
$?  获取执行的上一个指令的返回值(0  为成功,  非零为失败)
$#  获取当前 shell 命令行中参数的总个数

问题6:正则表达式中表示以…开头,和以…结尾的符号分别为?
解答:
^ 以…开头
$ 以…结尾,这个用的少

问题7:搜索/oldboy.txt中包含oldboy或linux字串的所有行,请给出命令。
解答:

[root@oldboy-B tmp]# cat /oldboy.txt|grep -E “oldboy|linux”
#==>很多同学喜欢这个低效的方法,希望看到本文后能改。
oldboy
linux
[root@oldboy-B tmp]# grep -E “oldboy|linux” /oldboy.txt
oldboy
linux
[root@oldboy-B tmp]# egrep  “oldboy|linux” /oldboy.txt
oldboy
linux
答案:grep -E “oldboy|linux” /oldboy.txt 或 egrep  “oldboy|linux” /oldboy.txt
问题8:处理以下日志文件内容,将域名取出来并根据域名进行计数排序处理:(百度和sohu面试题)
/oldboy.log

http://www.etiantian.org/index.html

http://www.etiantian.org/1.html

http://post.etiantian.org/index.html

http://mp3.etiantian.org/index.html

http://www.etiantian.org/3.html

http://post.etiantian.org/2.html

处理结果形式:
1 mp3.etiantian.org
2 post.etiantian.org
3 www.etiantian.org
前面的数字分别表示,后面的域名在文件中出现的次数。
实际上本题就是统计日志中访问不同域名的次数,并按次数排
说明:本题的思路非常有用,如生产环境中,可以通过netstat查看已建立连接的频繁访问服务的ip排序,
也可以查看web日志,看看一天或一个小时甚至几分钟内,列出IP访问量的排序等等。

解答:
[root@oldboy-A tmp]# cut -d “/” -f3 /oldboy.log |sort|uniq -c
1 mp3.etiantian.org
2 post.etiantian.org
3 www.etiantian.org
[root@oldboy-A tmp]# awk -F “/” ‘{print $3}’ /oldboy.log|sort|uniq -c
1 mp3.etiantian.org
2 post.etiantian.org
3 www.etiantian.org

问题9. 在Shell环境下,如何查看远程Linux系统运行了多少时间?( sohu面试题)
[root@oldboy-A tmp]# uptime
00:27:01 up  4:54,  1 user,  load average: 0.00, 0.01, 0.00           该答案应该还要添加ssh,前面已有解

  shell脚本编程实战模拟考试题(上机)


1.执行yum install httpd -y 安装httpd。
2.检查安装情况
[root@oldboy-B tmp]# rpm -qa httpd
httpd-2.2.3-45.el5.centos.1
3.启动httpd,并检查
[root@oldboy-B tmp]# /etc/init.d/httpd start
启动 httpd:[确定]
[root@oldboy-B tmp]# netstat -lnt|grep 80 #==>检查端口
tcp        0      0 :::80                       :::*                        LISTEN
[root@oldboy-B tmp]# ps -ef|grep httpd#==>检查进程
root      4041     1  0 14:24 ?        00:00:00 /usr/sbin/httpd
apache    4043  4041  0 14:24 ?        00:00:00 /usr/sbin/httpd
apache    4044  4041  0 14:24 ?        00:00:00 /usr/sbin/httpd
apache    4045  4041  0 14:24 ?        00:00:00 /usr/sbin/httpd
apache    4046  4041  0 14:24 ?        00:00:00 /usr/sbin/httpd
apache    4047  4041  0 14:24 ?        00:00:00 /usr/sbin/httpd
apache    4048  4041  0 14:24 ?        00:00:00 /usr/sbin/httpd
apache    4049  4041  0 14:24 ?        00:00:00 /usr/sbin/httpd
apache    4050  4041  0 14:24 ?        00:00:00 /usr/sbin/httpd
root      4061  3793  0 14:25 pts/0    00:00:00 grep httpd