常见的高频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)Java CPU过高的问题排查
举个例子,如下:
package com.classloading; public class Test { static class MyThread extends Thread { public void run() { // 死循环,消耗CPU int i = 0; while (true) { i++; } } } public static void main(String args[]) throws InterruptedException { new MyThread().start(); Thread.sleep(10000000); } }
使用top命令查看占用CPU过高的进程。如下图所示。
查看进程6102下线程的占用情况,如下图所示。
使用如下命令将6122转换为16进制表示,如下:
导出CPU占用高进程的线程栈。命令如下:
jstack pid >> java.txt
内容如下:
mazhi@mazhi:~$ cat java.txt Attaching to remote server pid, please wait... 2021-02-23 15:38:18 Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.192-b12 mixed mode): "Attach Listener" #10 daemon prio=9 os_prio=0 tid=0x00007f4ee0001000 nid=0x1956 runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE // 这是0x17ea线程,也是占用CPU最高的线程 "Thread-0" #9 prio=5 os_prio=0 tid=0x00007f4f180d6000 nid=0x17ea runnable [0x00007f4f044da000] java.lang.Thread.State: RUNNABLE at com.cpuhigh.Test$MyThread.run(Test.java:8) // 这里指示第8行,则正是死循环的代码开始 ...
导出的堆栈信息有线程的状态(一般要找RUNNABLE状态)和调用堆栈结合来查找问题。线程dump分析:线程dump分析主要目的是定位线程长时间停顿的原因