Linux面试题
常见的高频Linux面试题目如下:
(1)最近登录的5个帐号
当执行last -n
5命令时,输出的内容如下:
则需要用awk输出名称即可,具体如下:
last -n 5 | awk '{print $1}'
-n表示number,有多少行需要显示。读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域(默认为空白符),$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是"空白键" 或 "[tab]键",所以$1表示登录用户,$3表示登录用户ip,以此类推。
(2)用awk统计文本行数
awk '{count++} END{print "user count is ", count}' /etc/passwd
awk 'END{print "user count is " NR}' /etc/passwd
NR表示awk开始执行程序后所读取的数据行数
或者还可以使用wc命令,如下:
wc -l /etc/passwd
其中的命令参数-l还可以是--lines,表示显示行数。
(3)Test内容如下:
zhangsan 80
lisi 81.5
wangwu 93
zhangsan 85
lisi 88
wangwu 97
zhangsan 90
lisi 92
wangwu 88
要求输出格式:
name#######average#######total
zhangsan xxx xxx
lisi xxx xxx
wangwu xxx xxx
其中average为平均成绩,而total为总成绩
awk '{a[$1]+=$2;b[$1]++};END{for(i in a)print i,a[i]/b[i],a[i]}' test.txt
居然能用$1来当数据索引。END之前的逗号有没有都可以。
(4)这个文件夹里面每一层级都有个.svn隐藏文件夹,需要删除,使用如下命令:
$find . -type d -name "*.svn" | xargs rm -rf
-type指定为d,而d表示为目录。-f 即使原档案属性设为唯读,亦直接删除,无需逐一确认。-r 将目录及以下之档案亦逐一删除。
(5)统计以p开始的行的个数:
find -name test.sh -type f -print|xargs awk '/^p/{count++}END{print count}'
-type指定为f,表示普通文件。-print表示将结果输出到标准输出。
使用了xargs,将找到的文件名做为参数传递给awk命令,如果输出的是一行行内容,就没有必要加xargs了,如下:
$cat a.txt |awk '{print $2}'
xargs 与exec作用相同 ,起承接作用。区别在于 |xargs 主要用于承接删除操作 ,而 -exec 都可用 如复制、移动、重命名等,如:
find /bin -name bash -exec ls -l '{}' \;
对匹配的文件执行该参数所给出的shell命令。 形式为command {} \;,注意{}与\;之间有空格
(6)提取文件中含有"apa"的单词并输出到一个文件中
find . -name "*.txt"|xargs grep -oE "[a-zA-Z]*apa[a-zA-Z]*"|awk -F: '{print $2}'
sed 命令可以很好的进行行匹配,但从某一行中精确匹配某些内容,则使用 grep 命令并辅以 -o 和 -E 选项可达到此目的。其中 -o 表示“only-matching”,即“仅匹配”之意。光用它不够,配合 -E 选项使用扩展正则表达式则威力巨大。
(7)端口被占用
在 Web 开发中,经常会遇到「端口被占用」的场景
常规解决方案是:
-
使用 lsof -i 命令查询占用端口的进程 PID
-
利用 kill -9 PID 干掉目标进程
虽然只有 2 步,我也觉得很繁琐,即:既要记住命令,又要输入两次
8、linux查看tcp命令
使用netstat命令,或者用神器lsof命令
9、使用Linux命令找出日志文件中访问量最大的top10 IP地址
检验你是否熟悉Linux命令的常见问题:使用 Linux命令找出日志文件中访问量最大的top10 IP地址
日志文件test.log格式如下:
时间 IP ****
linux 命令如下:
cat test.log|awk -F " " '{print $2}'|sort|uniq -c|sort -nrk 1 -t' '|awk -F" " '{print $2}'|head -10
问题剖析:
1.cat *.log将文本内容打印到屏幕
2.使用awk命令可以按照分割符将一行分割为多个列,第一列用$1表示,第二列用$2表示,依次类推
awk -F " " '{print $2} // 表示用空格作为分隔符进行分割,打印出第2列
3.sort 进行排序,默认是按照ascii码进行排序的
4.uniq -c 统计相邻的行的重复数量,结果是类似 3 127.13.13.13,前面的数字代码重复的行数
sort|uniq -c // 统计重复的行数
5.sort -n是按照数值进行由小到大进行排序, -r是表示逆序,-t是指定分割符,-k是执行按照第几列进行排序
sort -nr -k 1 -t ' '
6.使用awk命令可以按照分割符将一行分割为多个列,第一列用$1表示,第二列用$2表示,依次类推
awk -F " " '{print $2}' // 表示用空格作为分隔符进行分割,打印出第2列
7.head -n表示取前n个
head -10