- 体系结构主要分为用户态(用户上层活动)和内核态
- 内核:本质是管理计算机硬件设备的程序。
- 程序直接管理硬件,包括CPU、内存空间、硬盘接口、网络接口等等,所有的内核操作都要通过内核传递给硬件,
- 上层软件必须依托内核中的CPU资源、内存资源、I/O资源等
- 系统调用:内核的访问接口,是一种能再简化的操作
- 可以看作一次原子操作
uname -a
,查看系统内核版本man 2 syscalls
,查看所有的系统调用接口man 2 对应的系统调用接口
,查看帮助
- 公用函数库:系统调用组合拳
- Shell:命令解释器,可编程
ls -lrt
,列出当前目录详情echo $SHELL
,或cat /etc/shells
查看shell的版本,可以使用chsh -s SHELL路径
一、查找特定文件
- find
- 语法:find path [options] params
- 作用:在指定目录下查找文件,例子为查找target.java,在home目录下递归寻找,使用的命令为:
find -name "target.java"
- 在home目录下查找所有tar开头的文件:
find ~ -name target*
,但是是区分大小写的,参数变为 ~iname就不用考虑大小写的问题了。
二、检索文件内容
-
grep
- 语法:grep [options] pattern file
- 全称:Global Regular Expression Print
- 作用:查找文件里符合条件的字符串
grep "Hell" target*
,查找文件里包含有Hell的行都被检索出来了,grep只会筛选出所在字符的行
-
管道操作符 |
- 可讲指令连接起来,前一个指令的输出作为后一个指令的输入
- 上面的查找find命令可以换成,
find ~ | grep "target.*"
- 可讲指令连接起来,前一个指令的输出作为后一个指令的输入
-
使用管道注意的要点
- 只处理前一个命令正确输出,不处理错误输出
- 右边命令必须能够接收标准输入流,否则传递过程中数据会被抛弃
- sed、awk、grep、cut、head、top、less、more、wc、join、sort、split等
-
在日志中查找存有错误的句式:
grep 'partial\[true\]' bsc-palt-data.info.log | grep -o 'engine\[[0-9a-z]*\]'
,这样会将前面的输出流作为后面的输入流作为进一步筛选,执行之后,只会显示engine[xxxx]相关的元素 -
ps -ef | grep tomcat
,会产生一条本指令查询的线程,想忽略这个线程的话,需要在后面添加ps -ef | grep tomcat | grep -v "grep"
即可实现 -
常用的有
grep 'partial\[true\]' bsc-palt-data.info.log
grep -o 'engine\[[0-9a-z]*\]'
grep -v "grep"
,过滤掉相关字符串的内容,可与上面的组合使用
三、对文件内容做统计
- 想统计并检索出某变量为true的出现的次数
- 当我们发现某个检索引擎的关键变量的值为true的时候,并且超过一定次数的时候,则说明改引擎需要从集群中摘掉,并且进行紧急修复。
3.1 awk指令
- awk [options] ‘cmd’ file
- 一次读区一行文本,按输入分割符进行分片,切成多个组成部分。
- 将切片直接保存在内建的变量中,$1, $2…($0表示行的全部)
- 支持对单个切片的判断,支持循环判断,默认分隔符为空格
- 对文件取出第一列和第四列
awk '{print $1,$4}' netstat.txt
,执行之后$1保存的是切片1的内容,$4是切片4的内容,是按列逐行保存起来的。 - 对文件根据不同的列的对象条件筛选
awk '$1=="tcp" && $2==1{print $0}' netstat.txt
,Proto为tcp且Recv-Q为1的整行元素打印出来 - 筛选出表头,参照第二个
awk '($1=="tcp" && $2==1) || NR==1 {print $0}' netstat.txt
- 通过","作为分割符进行筛选
awk -F "," '{print $2}'
,直接筛选第二列,-F是以什么作为分割符
- 对文件取出第一列和第四列
- 这里是统计engine出现的次数,上面作为grep查找的输出结果中找到重复出现的engine的出现次数
awk '{enginearr[$1]++}END{for(i in enginearr)print i "\t" enginearr[i]}'
- 特别适合处理类似表格方面的数据
- 默认的分割符是空格,可以通过-F改变
四、批量替换文本内容
- 这种一般是脱离了IDE,对java的代码文件进行批量的替换修改。
4.1 sed指令
- 语法:
sed [option] 'sed command' filename
- 全名 stream editor,流编辑器
- 适合对于文本的行内容进行处理,可以添加正则表达式
sed 's/^Str/String/ replace.java
默认将修改的replace.java文件中的Str修改为String,并且输出到终端,但是原有文件并不做修改。"^"开头的意思sed -i 's/^Str/String/ replace.java
可以修改原有的文件sed -i 's/\.$/\;/' replace.java
其中".“和”;“都是需要添加”“转义,而后面的”$"表示一行的结束sed -i 's/Jack/me/g' replace.java
后面的g添加了就表示全文中都更换,不添加g只是修改本行遇到的第一个字符串sed -i 's/^ *$/d' replace.java
^ *$
中间的空格和*表示开头到结尾都是空格,后面的“d”表示符合条件的都删除sed -i 's/Integer/d' replace.java
删除行内有Integer的行