Linux面试
Linux体系结构
Linux体系结构主要分为用户态(用户上层活动)和内核态。
- 内核:本质是一段管理计算机硬件设备(CPU、内存空间,硬盘接口,网络接口等)的程序,所有的计算机操作都要通过内核传递给硬件。用户态以及上层应用的活动空间,应用程序的执行必须依托于内核提供的资源,包括CPU资源,存储资源,IO资源等。为了使上层应用访问到这些资源,内核必须为上层应用提供访问的接口,即系统调用。
- 系统调用:内核的访问接口,是一种不能再简化的操作。
- 公用函数库:系统调用的组合拳。
- shell本质上是个命令解释器,下通系统调用,上通各种应用, 同时是可编程的。
如何查找特定的文件
1.find
语法 find path [options] params
-
作用:在指定目录下查找文件和子目录
find -name 文件名 会在当前目录递归寻找,最终找到文件夹或文件 find / -name 文件名 会从根目录递归寻找文件 find ~ -name "target*" 会从home目录下递归寻找target打头的文件名 find ~ -iname "target*" 从home目录下忽略大小写递归查询target打头的文件名 man find 查找find指令相关用法
检索文件内容
1. grep
语法: grep [options] pattern file
- 全称 Global Regular Expression Print
- 作用:查找文件里符合条件的字符串。能使用正则表达式搜索文本,并把匹配的行打印出来
grep "moo" target*
从target打头的文件里查找moo打头的行
若grep指令后不输入文件名如(grep "haha"),那系统就会等待用户输入,输入haha后时才会反应
2.管道操作符 |
-
可将指令连接起来,前一个指令的输出作为后一个指令的输入
tail -f catalin.out| grep "异常"
在实时输出的日志里查询"异常"所在的行
find ~ | grep "target"
find ~ 在Home目录下递归查询所有的文件和文件夹
grep "target"会从当前的标准输入中获取数据查询"target"所在的行
将find ~ 查询到的内容作为输入传递到grep "target"语句中。
- 使用管道注意的要点
- 只处理前一个命令的正确输出,不处理错误输出
- 管道操作符(|)右边命令必须能够接受标准输入流,否则传递过程中数据会被抛弃
- 右边的常用命令 sed,awk,grep,cut,head,top,less,more,wc,join,sort,split等
grep 的小用法
-
-o 或 --only-matching : 只显示匹配PATTERN 部分。
-
-v:显示不匹配文本的所有行
grep 'abc' filename| grep -o 正则表达式 查找filename含字符串abc所在行中满足正则表达式的部分
ps -ef|grep tomcat 查找和tomcat相关的进程的信息 ps -ef|grep tomcat|grep -v "grep" 在上面指令的基础上去除掉 进程 ps -ef|grep tomcat|grep -v "grep"
对文件内容做统计
1. awk
awk特别适合处理表格化的数据
语法:awk [option] 'cmd' file
-
一次读取一行文本,按输入分隔符进行切片, 切成多个组成部分。
-
将切片直接保存在内建的变量中,$1,$2…($0表示行的全部)。
-
支持对单个切片的判断,支持循环判断,默认分隔符为空格。
awk '{print $1,$4}' netstat.txt将切片1(proto列)和切片4(Local列)打印出来
awk '$1=="tcp" && $2==1{print $0}'筛选出切片1=tcp,切片2=1的行,并把整行都打印出来
如果我们同时想读取表头,就可以写
awk '($1=="tcp" && $2==1)|| NR==1 {print $0}'
NR是内建变量表示从awk开始执行后,按照记录分隔符读取的数据次数,默认的记录分隔符为换行符,因此默认的就是读取的数据行数,NR可以理解为Number of Record的缩写
awk默认用空格将信息按列分隔开,我们可以使用其他符号来把列分开
- -F : 声明分隔符来分隔行内容
awk -F "," '{print &2}' test.txt
2.统计操作
例子:筛选出partial==true的引擎,并统计该引擎partial为true的次数
grep 'partial\[true\]' XXX.log |grep -o 'engine\[[0-9a-z]*\]'
筛选出partial[true]的行中engine[XXXX]的部分
grep 'partial\[true\]' XXX.log |grep -o 'engine\[[0-9a-z]*\]'|awk '{enginearr[$1]++}END[for(i in enginearr) print i "\t" enginearr[i]]'
3.常见指令
awk '{print $1,$4} XXX.txt' //筛选出文件中某一列的数据,筛选文件也可以是多个,只要按照空格再传入多个文件即可
awk '$1=="tcp" && $2==1 {print $0}' netstat.txt //对列依据一定的条件筛选文件的行数据
awk '{enginearr[$1]++}END{for (i in enginearr) print i "\t" enginearr[i]}' 对内容逐行进行统计操作,并列出统计次数和统计对象
-F可以声明分隔符
批量替换文档里的内容
1.sed
语法:sed[option] 'sed command' filename
- 全名 stream editor,流编辑器
- 适合对行操作
例子:如下部分str部分开头大写,我们想改为String
sed 's/^Str/String' replace.java
s代表替换,^Str代表以Str开头内容,将它们替换成String.
但是sed 默认将改变后的内容输出到终端,如果要改变文件内容,还需要加入-i
sed -i 's/^Str/String' replace.java
替换每一行的结尾的.为;
sed -i 's/\.$/\;/' replace.java
$表示以XX结尾。
sed 默认只替换一行中首次出现的字符串,如果要进行全文替换,需要加g
2. 删除某行
删除的空行
sed -i '/^ *$/d'
d表示要删除符合条件的行
vim 小用法
vim一个文件后
输入 /[你想查找的字段]
就可以标亮你想查找的字段