前几天面试,被一位面试官嫌弃了“你的Linux命令有点low”。被嫌弃也挺正常的,因为我的简历写的我自己都有点看不下去:了解Linux常用命令,如lstail -f等命令,基本满足日常的开发。面试官人很好,整个面试进行地也很愉快。说心里话,还是挺感激的,因为很少有面试官会指出我的简历上出现的问题。所以呢,今天就来聊一聊不low的Linux命令——搜索文件的find命令、搜索文件内容的grep命令、对文件内容进行统计的awk命令、批量替换文件内容的sed命令。

find命令

find简介

find命令是一个用于搜索文件的命令。find命令的基本语法:find path [option] params

path为搜索文件的路径,可以是相对路径,也可以是绝对路径,还可以指定多个路径,如:find /var /home

主要选项(option)如下:

选项 含义
-depth 在查看目录本身之前先搜索目录的内容
-follow 跟随符号链接
-maxdepths N 最多搜索N层目录
-mount 不搜索其他文件系统中的目录

主要参数(param)如下:

参数 含义
-atime N 文件在N天之前被最后访问过
-mtime N 文件在N天之前被最后修改过
-name pattern 文件名需要匹配pattern
-newer otherfile 文件比其他文件要新
-type c 文件类型为c,最常见的是d(目录)和f(普通文件)
-user username 文件的拥有者是username
-size +1M 文件大小。例子为查找文件大小大于1M的。
-perm 644 文件权限。例子为查找文件权限为644的。

常用方法

  • 精确查找文件:find ~ -name "spur.java"

  • 模糊查找:find ~ -name "spur*"

模糊查找可以找到spur开头的文件和目录,那如果要单独查找目录或者单独查找文件怎么办呢?

其实有个-type可以用来筛选目录和文件,查找文件在上面的命令后面添加-type f,查找目录加-type d

  • 忽略文件名大小写进行查找文件:find ~ iname "spurt*"
  • 查找文件并恢复文件权限:find -type f -exec chmod -R 644 {} \;
  • 删除30天之前的日志文件:find -type f -name "*.log" -mtime +30 -exec rm -rf {} \;

grep命令

grep简介

grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行,基本语法为grep [options] pattern [file]

如果没有提供文件名,则grep命令将会搜索标准输入。

主要选项(option)如下表:

选项 含义
-c 输出匹配行的数目
-h 取消每个输出行的普通前缀
-i 忽略大小写
-l 查找多个文件,只列出包含匹配行的文件名
-v 反向查找
-n 顺便输出行号

常用方法

  • 在文件中搜索字符串,然后输出匹配的行。例如匹配文件spur.txt中的字符串for,并输出整行,要求带行号:grep -n for spur.txt

  • 计算匹配的行的数目:grep -c for spur.txt

  • 管道操作符“|”可将指令连接起来,前一个指令的输出作为后一个指令的输入。注意:只有前一个命令正确输出的时候,才会处理后一个命令。例如:find ~ | grep for

  • 匹配ip地址:egrep --color "([0-9]{1,3}\.){3}[0-9]{1,3}$" test.txt

awk命令

awk简介

AWK是Unix系统下一个非常强大的文本处理工具。AWK其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 本身也可以作为一门计算机脚本语言。它允许创建简短的程序,这些程序可以读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表等其他的功能。

  • awk知识要点

    • 语法:awk [options] 'cmd' file
    • 一次读取一行文本,按输入分隔符进行切片,切成多个组成部分(一行为一个record,一列为一个field)
    • 将切片直接保存在内建的变量中,$1,$2...($0表示行的全部)
    • 支持对单个切片的判断,支持循环判断,默认分隔符为空格

常用方法

这里有个spur.txt的文件,文件内容如下:

  • 使用awk命令查看全部文件内容:awk '{print}' spur.txt

print是awk的内置函数,用于打印出变量的值。

  • 打印某一列或者某几列:$1为第1列,$2为第2列,...($0表示全部)

以打印第1列和第4列为例:awk '{print $1,$4}' spur.txt

  • 分隔符的使用。

awk认为“,”为系统默认分隔符,“ ”为直接连接起来。

例如第2个例子中awk '{print $1,$4}' spur.txt,使用的是默认分隔符,结果两列之间有空格隔开的。

本例子使用awk '{print $1 $4}' spur.txt,使用的是直接相连,结果两列之间没有空格隔开。

当然,也可以自定义分隔符。如果希望用“-”分割,可以这么写:awk '{print $1 "-" $4}' spur.txt

  • 内置变量NR和NF的使用。

Awk定义一行为一个record,一列为一个field。NR为行数(number of record),NF为列数(number of field)。

例如查找打印最后一列为2794的记录并打印:awk '$NF==2794{print $0}' spur.txt

  • BEGIN语句块和END语句块。

BEGIN用于awk 开始处理输入文件中的文本之前执行初始化代码。

END用于执行最终计算或打印应该出现在输出流结尾的摘要信息。

继续以分隔符举例,我们可以使用BEGIN语句块来定义全局变量,FS为输入分隔符,OFS为输出分隔符。

提示:如果awk命令后面不加文件名,awk则认为下一行输入的内容为需要处理的内容。

设置“,”为输入分隔符,“\t”为输出分隔符:

  • 正则表达式(Regular Expression)的使用。

正则表达式估计大家都比较了解,就不多唠叨了,下面列出几个常用的:

字符 描述
. 匹配任意一个字符
^ 匹配开头。/^abc/匹配以abc开头字符串
$ 匹配结尾。/abc$/匹配以abc结尾的字符串
[abc] 字符集合。匹配所包含的任意一个字符。
[^a-z] ^放在方括号里面表示非。[^a-z]匹配不是a-z的字符串
* 匹配前面的子表达式零次或多次。
+ 匹配前面的子表达式一次或多次。
? 匹配前面的子表达式零次或一次。
{n} 匹配n次。/ab{3}c/匹配b出现3次。
{n,m} 匹配n-m次。ab{3,10}c匹配b可以出现3次至10次。
{n,} 至少匹配n次。/ab{3,}c/匹配b出现3次及3次以上。
() ()看成一个整体。/(ab)+c/:ab作为一个整体,至少出现一次。

例如需要匹配出马刺队所有的后卫球员,也就是正则匹配spur.txt中包含guard的记录:awk '/guard/{print $0}' spur.txt

匹配第3列以“te”结尾,打印所有的列:awk '$3 ~ /(te)$/{print $0}' spur.txt

注意:“~”表示模式开始。“//” 中是模式。

这是一道我面试某视频娱乐公司的面试题,像这种难度的小问题还希望大家多重视。

更多的操作可以参考:Awk官方文档

sed命令

sed简介

Sed的全名为Stream Editor,流编辑器,适合用于对文本的行内容进行处理。基本语法为:sed [option] 'sed command' filename

常用的选项:

选项 含义
-n 使用安静模式
-e 直接在指令列模式上进行 sed 的动作编辑
-f 直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作
-r 在脚本中使用扩展正则表达式
-i 直接修改读取的档案内容,而不是将修改结果输出到终端上

常用的命令:

命令 含义
a 新增行
c 取代行
d 删除行,d 后面通常不加任何字符
i 插入行
p 打印
s 替代

常用方法

  • 删除指定的行(删除1-3行为例):sed '1,3d' replace.txt
  • 新增一行:sed '1a hello world' replace.txt
  • 替换某行:sed '1c hello world' replace.txt
  • 把“Str”开头的行替换为“String”,仅输出到终端显示:sed 's/^Str/String/' replace.txt
  • 字符串替换,把replace.txt中全部的“Jack”替换为“me”,要求在文档中修改:sed -i 's/Jack/me/g' replace.txt
  • 替换末尾的“.”为“;”:sed -i 's/\.$/\;/' replace.java

小结

本文介绍了find命令、grep命令、awk命令、sed命令的基本使用方法,希望对大家有帮助。

来聊一聊不low的Linux命令——find、grep、awk、sed的更多相关文章

  1. Linux查找命令:grep,awk,sed

    grep grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具 ...

  2. linux相关(find/grep/awk/sed/rpm)

    如何查找特定的文件: find :在指定目录下查找文件 find -name "filename" :从当前目录查找文件 find / -name "filename&q ...

  3. 【linux命令】grep

    1.作用Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全局 ...

  4. linux命令之grep用法介绍

    Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全局正则表达 ...

  5. 每天一个linux命令(51)--grep命令

    linux系统中grep 命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来.grep 全称是 global regular expression print,表示全局正则 ...

  6. 【Linux命令】grep命令

    1.作用 Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全 ...

  7. Linux命令——find/grep

    这两个命令写起来会很多,这里只简单的写一些东西,加深自己的印象. 一.find find命令主要作用是沿着文件层次结构向下遍历,匹配符合条件的文件,并执行相应的操作. 1)命令格式 find [参数] ...

  8. 每天学点Linux命令之grep 和 wc命令

    Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expr ession Print,表示全局正则表 ...

  9. 每日linux命令学习-grep模式检索

    grep模式检索指令包括grep,egrep,和fgrep,.Linux系统使用正则表达式优化文本检索,所以在此,笔者首先学习了一下正则表达式. 1. 正则表达式 正则表达式使用被称为元字符(Meta ...

随机推荐

  1. Cocos2d-x 实战

    跨平台商业项目实战:攻城大作战游戏创意触发点:做什么样的游戏?分析当前主流的游戏:经典游戏(俄罗斯方块).大众化的游戏(卡牌游戏.休闲游戏).重口味游戏. 游戏创意:生活当中 游戏开发流程:1.策划方 ...

  2. thinkphp实现数据分页

    方法一: public function show_cate(){ $category_name = array( '1' => '政法综治前沿', '2' => '政策法规', '3' ...

  3. java语言浅显理解

    从厉害的c语言.到经久不衰的java语言.到不太火的安卓和IOS,到当下流行的python,这些都是软件开发中的一员. 之前在传智播客上的免费视频资源上,听了老师对java语言的介绍,感觉挺好了.今天 ...

  4. Maven学习(七)-- 使用Maven构建多模块项目

    摘自:http://www.cnblogs.com/xdp-gacl/p/4242221.html 在平时的Javaweb项目开发中为了便于后期的维护,我们一般会进行分层开发,最常见的就是分为doma ...

  5. 战争热诚的python全栈开发之路

    从学习python开始,一直是自己摸索,但是时间不等人啊,所以自己为了节省时间,决定报个班系统学习,下面整理的文章都是自己学习后,认为重要的需要弄懂的知识点,做出链接,一方面是为了自己找的话方便,一方 ...

  6. Docker的安装和测试

    1,Docker安装 Docker是啥,以及其与虚拟机的对比,就不介绍了,网上有很多资源可以学习和了解. 本篇文章重点介绍Docker的安装和测试使用. Docker的安装,分为离线安装和在线安装两种 ...

  7. java反射获取类的类名、属性名、属性类型、方法、执行方法、构造函数

    public class Demo02 { @SuppressWarnings("all") public static void main(String[] args) thro ...

  8. mysql中float类型使用总结

    对于单精度浮点数Float:  当数据范围在±131072(65536×2)以内的时候,float数据精度是正确的,但是超出这个范围的数据就不稳定,没有发现有相关的参数设置建议:将float改成dou ...

  9. SSM-MyBatis-05:Mybatis中别名,sql片段和模糊查询加getMapper

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 简单概述一下本讲 别名,sql片段简单写一下,模糊查询多写一点 一.别名 <typeAliases> ...

  10. springboot整合shiro后报java.lang.ClassCastExcepting异常

    最近搭一个springboot的框架,整合了shiro和redis,由于平常习惯用热部署,所以自然的引入了热部署的包,但是引入后报如下错误: 没错,这个问题害我搞了一天,后来删除热部署,项目正常的跑飞 ...