Java面试12|Linux及Shell脚本

1、关于awk命令的面试题

 

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

1
last -n  5  | awk -F  ':' (指定域分割符号)   '{print $1}'

-n表示number,有多少行需要显示。读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是"空白键" 或 "[tab]键",所以$1表示登录用户,$3表示登录用户ip,以此类推。

(2)awk统计文本行数

1
2
3
awk  '{count++} END{print "user count is ", count}'  /etc/passwd
 
awk  'END{print "user count is " NR}'  filename

或者直接wc -l 文件名也可以

1
grep -o  '此设备id在黑名单之内'  jr-adx-dsp_dspbidding.log.20170626* | wc -l

还有很多其它的,如:

(3)Test内容如下:

1
2
3
4
5
6
7
8
9
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为总成绩 

1
awk  '{a[$1]+=$2;b[$1]++};END{for(i in a)print i,a[i]/b[i],a[i]}'  test.txt

居然能用$1来当数据索引。 

 

(4)这个文件夹里面每一层级都有个.svn隐藏文件夹,需要删除,使用如下命令:

1
$find . -type d -name  "*.svn"  | xargs rm -rf

(5)统计以p开始的行的个数:

1
find -name test.sh -type f -print|xargs awk  '/^p/{count++}END{print count}'

使用了xargs,将找到的文件名做为参数传递给awk命令,如果输出的是一行行内容,就没有必要加xargs了,如下:

1
$cat a.txt |awk   '{print $2}'

(6)提取文件中含有"apa"的单词并输出到一个文件中

1
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 选项使用扩展正则表达式则威力巨大。 

 

参考:http://www.cnblogs.com/chengmo/archive/2010/10/10/1847287.html 

  

2、编写一个简单的Shell脚本

查找/root/目录下是否存在该文件

1
2
3
4
5
6
7
#/bin/bash   // 以bash shell来解释
echo  "enter a file name:"
read a       // 读取用户输入的信息并向右侧变量分配用户输入的值
if  test  -e /root/$a    //  test检查文件和比较值,注意变量引用时用$
then echo  "the file is exist!"
else  echo  "the file is not exist!"
fi

if/else条件的格式如下:

1
2
3
4
5
6
if [表达式] 
  then
      命令语句块
else
      命令语句块
fi

 

 

3、Linux系统监控命令

(1)top命令:Linux命令。可以查看实时的CPU使用情况。也可以查看最近一段时间的CPU使用情况。

(2)ps命令:Linux命令。强大的进程状态监控命令。可以查看进程以及进程中线程的当前CPU使用情况。属于当前状态的采样数据。

(3)jstack:Java提供的命令。可以查看某个进程的当前线程栈运行情况。根据这个命令的输出可以定位某个进程的所有线程的当前运行状态、运行代码,以及是否死锁等等。

(4)pstack:Linux命令。可以查看某个进程的当前线程栈运行情况。

(5)磁盘使用情况:iostat

具体可以参看文章:https://i.cnblogs.com/EditPosts.aspx?postid=5702288&update=1

 

4、线上CPU100%,如何定位和排查问题  

(1) 

1.jps 获取Java进程的PID 

2.jstack pid >> java.txt 导出CPU占用高进程的线程栈 

3.top -H -p PID 查看对应进程的哪个线程占用CPU过高 

4.echo “obase=16; PID” | bc 将线程的PID转换为16进制,大写转换为小写 

5.在第二步导出的Java.txt中查找转换成为16进制的线程PID。找到对应的线程栈,分析负载高的线程栈都是什么业务操作。优化程序并处理问题。

(2)

1.使用top 定位到占用CPU高的进程PID,并查看进程具体信息

1
2
top   // 命令获取进程相关的信息,并找到占用CPU高的线程
ps aux | grep PID  // 得到PID进程的具体信息,比如是个Tomcat服务进程

2、获取线程相关信息

1
ps -mp pid -o THREAD,tid,time | sort -rn

ps命令的几个参数:

-m显示所有的线程

-p pid进程使用cpu的时间

-o 用户自定义格式

tid 线程id

sort命令的两个参数:

-n  依照数值的大小排序
-r  以相反的顺序来排序

3.将需要的线程ID转换为16进制格式

1
printf  "%x\n"  tid

4.打印线程的堆栈信息

1
jstack pid |grep tid -A  30

-A 30 匹配行的后30行内容

参考文章:

(1)http://www.cnblogs.com/dragonflyyi/p/4343778.html

(2)http://www.cnblogs.com/pangguoping/p/5715848.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值