Linux面试题

常见的高频Linux面试题目如下:

(1)最近登录的5个帐号

当执行last -n 5命令时,输出的内容如下:

Linux面试题

则需要用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过高的进程。如下图所示。

Linux面试题  

查看进程6102下线程的占用情况,如下图所示。

Linux面试题 

使用如下命令将6122转换为16进制表示,如下:

Linux面试题 

导出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分析主要目的是定位线程长时间停顿的原因 

Linux面试题

 

 

 

 

  

 

  

  

 

 

 

 

 

 

 

 

  

    

Linux面试题

上一篇:Mac文件智能管理神器


下一篇:U盘安装Ubuntu