面试之Linux
Linux的体系结构
- 体系结构主要分为用户态(用户上层活动)和内核态
- 内核:本质是一段管理计算机硬件设备的程序
- 系统调用:内核的访问接口,是一种不能再简化的操作
- 公用函数库:系统调用的组合拳
- Shell:命令解释器,可编程
Linux面试常考命令
面:如何查找特定的文件?
答:可以使用find命令。语法:find path [options] params
。含义:在指定目录下查找文件。
[spider@izwz9d74k4cznxtxjeeur9z ~]$ find -name "spi*" #在当前目录下查找以spi开头的文件
./spider-novels
./spider-novels/novels/novels/spiders
[root@izwz9d74k4cznxtxjeeur9z spider]# find / -name "qwert.txt" #从根路径开始查找名为qwert.txt的文件
/home/spider/qwert.txt
面:如何检索文件的内容?
答:可以使用grep命令。语法grep [option] pattern file
.
[root@izwz9d74k4cznxtxjeeur9z spider]# cat test*
This is a beautiful girl.
Hello world!
Thank you.
[root@izwz9d74k4cznxtxjeeur9z spider]# grep "Thank" test* #从test开头的文件中,检索出含有Thank的行
Thank you.
若grep后面没有加文件名,则表示从标准输入流中获取输入,此时可以配合管道连接符|一起使用。
[root@izwz9d74k4cznxtxjeeur9z spider]# find -name "test*" | grep "test.txt" #表示find命令的结果作为grep命令的标准输入
./test.txt
面:如何对文件内容(表格)做出统计?
答:可以使用awk命令,语法awk [option] 'cmd' file
。一次读取一行文本,按输入分隔符进行切片,切成多个组成部分;将切片直接保存在内建的变量中,$1,$2...($0表示行的全部);支持对单个切片的判断,支持循环判断,默认分隔符为空格。
现有一个文件,格式类似于表格,其中包含了选课信息等。
[root@izwz9d74k4cznxtxjeeur9z spider]# ll
总用量 152
-rw-r--r-- 1 root root 144153 3月 18 10:28 2019年春季学期专业选修课选课表.txt
drwxr-xr-x 3 root root 4096 2月 26 13:43 spider-novels
-rw-r--r-- 1 root root 50 3月 18 08:53 test.txt
[root@izwz9d74k4cznxtxjeeur9z spider]# head 2019*
学生学院 专业班级(方向) 年级 人数 课程名 课程号 课序号 课程属性 学分 学时 开课单位 任课教师 选课限制说明
石工院 海洋油气工程(一班) 2016 24 海洋油气工程仪表与自动化 9111008030 2399 限选 3 48 电信院 杨青 海洋油气1601
石工院 海洋油气工程(一班) 2016 24 海洋完井工程 9111011030 2399 限选 3 48 石工院 熊友明、刘理明 海洋油气1601
石工院 海洋油气工程(一班) 2016 24 海洋油气集输工程 9115006030 2398 限选 3 48 石工院 邓雄 海洋油气1601
石工院 海洋油气工程(二班) 2016 29 海洋油气工程仪表与自动化 9111008030 2399 限选 3 48 电信院 杨青 海洋油气1602
石工院 海洋油气工程(二班) 2016 29 海洋完井工程 9111011030 2399 限选 3 48 石工院 熊友明、刘理明 海洋油气1602
石工院 海洋油气工程(二班) 2016 29 海洋油气集输工程 9115006030 2399 限选 3 48 石工院 朱红钧 海洋油气1602
石工院 石油工程(创新班) 2016 51 油气藏开发地质学(1组) 3404596025 2397 限选 2.5 40 地科院 牟中海 任选其一
石工院 石油工程(创新班) 2016 51 油气藏开发地质学(2组) 3404596025 2398 限选 2.5 40 地科院 赵晓明
石工院 石油工程(创新班) 2016 51 油气藏开发地质学(3组) 3404596025 2399 限选 2.5 40 地科院 周彦
如何提取出第一列学生的学院和第四列人数?
[root@izwz9d74k4cznxtxjeeur9z spider]# awk '{print $1, $4}' 2019*
学生学院 人数
石工院 24
石工院 24
石工院 24
石工院 29
石工院 29
石工院 29
石工院 51
石工院 51
石工院 51
石工院 32
石工院 32
石工院 32
石工院 27
石工院 27
石工院 27
......
过滤输出院系为计科院、且年级为2015级的选课信息。
分析:院系为第一列,年级为第三列。
[root@izwz9d74k4cznxtxjeeur9z spider]# awk '$1=="计科院"&&$3==2015 {print $0}' 2019*
计科院 计算机科学与技术 2015 177 自主和交互式学习(二课) 5615026020 2499 限选 2 2周 计科院 岳静
计科院 计算机科学与技术 2015 177 嵌入式程序设计大赛(二课) 5615027020 2499 限选 2 2周 计科院 何志敏
计科院 软件工程 2015 194 创新创业项目培育孵化(二课) 5815201020 2499 限选 2 2周 计科院 廖浩德
计科院 软件工程 2015 194 软件外包项目驱动(二课) 5815202020 2499 限选 2 2周 计科院 张剑
计科院 软件工程 2015 194 程序设计第二课堂(二课) 5815203020 2499 限选 2 2周 计科院 杨力
计科院 软件工程 2015 194 大数据与机器学习(二课) 5815204020 2499 限选 2 2周 计科院 王兵
计科院 软件工程(卓越班) 2015 57 科技竞赛(二课) 5815601020 2499 限选 2 2周 计科院 杨力
计科院 软件工程(卓越班) 2015 57 科研项目(二课) 5815602020 2499 限选 2 2周 计科院 张剑
计科院 软件工程(卓越班) 2015 57 虚拟创业(二课) 5815603020 2499 限选 2 2周 计科院 杨力
计科院 软件工程(卓越班) 2015 57 资格认证(二课) 5815604020 2499 限选 2 2周 计科院 廖浩德
计科院 网络工程 2015 110 信息安全大赛(二课) 6015018020 2499 限选 2 2周 计科院 张恒汝
计科院 网络工程 2015 110 互联网应用开发大赛(二课) 6015019020 2499 限选 2 2周 计科院 张小洪
计科院 网络工程 2015 110 网络配置大赛(二课) 6015020020 2499 限选 2 2周 计科院 何中越
计科院 网络工程 2015 110 创新创业项目培育孵化(二课) 6015021020 2499 限选 2 2周 计科院 陈雁
计科院 物联网工程 2015 132 物联网应用设计(二课) 9815356030 2499 限选 3 3周 计科院 梅大成
计科院 信息管理与信息系统 2015 69 电子商务类比赛认证(二课) 7015031010 2499 限选 1 1周 计科院 杨力
计科院 信息管理与信息系统 2015 69 ERP类比赛认证(二课) 7015032010 2499 限选 1 1周 计科院 钟学燕
上面的结果没有表头,我们可以使用NR==1输出第一行,即表头。
[root@izwz9d74k4cznxtxjeeur9z spider]# awk 'NR==1 {print $0}' 2019*
学生学院 专业班级(方向) 年级 人数 课程名 课程号 课序号 课程属性 学分 学时 开课单位 任课教师 选课限制说明
面:如何批量替换文本的内容
答:可以使用sed命令,语法:sed [option] 'sed command' filename
。全名stream editor,流编辑器;适合用于对文本的行内容进行处理。
现有一个java文件如下:
[root@izwz9d74k4cznxtxjeeur9z spider]# cat replace.java
Str a = "The beautiful girl's bot friend is Jack'.
Str b = "The beautiful girl often chats with Jack and Jack is Jack".
Str c = "The beautiful girl loves Jack so much".
Integer bf = new Integer(2);
首先需要将每一行的Str修改为String。
[root@izwz9d74k4cznxtxjeeur9z spider]# sed 's/^Str/String/' replace.java #替换后,原文件没有发生改变,如需改变需要加入-i选项
String a = "The beautiful girl's bot friend is Jack'.
String b = "The beautiful girl often chats with Jack and Jack is Jack".
String c = "The beautiful girl loves Jack so much".
Integer bf = new Integer(2);
将每一行的.
变为;
,需要加入转义字符。
[root@izwz9d74k4cznxtxjeeur9z spider]# sed -i 's/\.$/\;/' replace.java
[root@izwz9d74k4cznxtxjeeur9z spider]# cat replace.java
String a = "The beautiful girl's bot friend is Jack';
String b = "The beautiful girl often chats with Jack and Jack is Jack";
String c = "The beautiful girl loves Jack so much";
Integer bf = new Integer(2);
将每行的Jack都替换成me,注意加入g选项,表示全文替换,否则每一行只有第一个Jack会被替换。
[root@izwz9d74k4cznxtxjeeur9z spider]# sed -i 's/Jack/me/g' replace.java
[root@izwz9d74k4cznxtxjeeur9z spider]# cat replace.java
String a = "The beautiful girl's bot friend is me';
String b = "The beautiful girl often chats with me and me is me";
String c = "The beautiful girl loves me so much";
Integer bf = new Integer(2);
删除所有的空行,此时不需加入s选项表示字符串,加入d选项表示操作行。
[root@izwz9d74k4cznxtxjeeur9z spider]# sed -i '/^ *$/d' replace.java
[root@izwz9d74k4cznxtxjeeur9z spider]# cat replace.java
String a = "The beautiful girl's bot friend is me';
String b = "The beautiful girl often chats with me and me is me";
String c = "The beautiful girl loves me so much";
Integer bf = new Integer(2);
参考资料
不积跬步,无以至千里;不积小流,无以成江海