最新要闻
- 环球观点:AMD RDNA3显卡架构底层细节公开!606页 应有尽有
- 前沿资讯!微信隐藏功能无了!群空间助手小程序宣布3月下线:号称永久保存
- 世界滚动:腾讯优酷后!爱奇艺限制投屏 会员只能看480P:专家发声 用户只能接受
- 环球快看点丨SUV比亚迪卖爆!榜一大哥月销7万+、一代神车没落
- 《黑豹2》女主演利蒂西娅·赖特:续集已在计划中
- 头条:疑似零跑C11路边停车起火 车尾疯狂往外喷火
- 男子开豪车带马狗羊回家过年 它们都是自己的家人:画面让网友难受
- 公交司机边开车边抠脚引乘客担忧 官方回应:会研究处理
- 内存、SSD价格雪崩 韩国芯片双雄终于顶不住了?
- 又一日系品牌拥抱比亚迪 铃木EVX概念车首发:用上刀片电池
- 全球视点!美国最大私人地主 大量买地引质疑!比尔盖茨回应:只为提高产量
- 国产家轿又一“黑马”诞生 长安逸达首发亮相
- 原长城汽车总裁王凤英将出任小鹏CEO 接替何小鹏?内部回应
- 笛福被称为什么的美誉?笛福的作品有哪些?
- 围棋哪个国家最强?围棋哪个颜色先下?
- 都挺好苏明成知道自己不是亲生的是第几集?都挺好的结局是什么?
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
别催了,别催了,这篇文章我一次性把Shell的内容说完
Shell 搜索与匹配
1、在文件中查找字符串
grep 命令可以搜索文件,查找指定的字符串。
(资料图)
$ grep myvar *.c
在这个例子中,我们搜索的文件全都位于当前目录下。因此,我们只使用了简单的 shell 模式 *.c 来匹配以 .c 结束的文件,并没有在文件名前再添加路径。
但并非所有待搜索的文件都老老实实地待在当前目录下。但因为shell 并不在意你输入多少路径名,所以我们也可以这么写:
$ grep myvar ../lib/*.c ../server/*.c ../cmd/*.c */*.c
如果待搜索的文件不止一个,grep 会在输出前加上文件名以及冒号,然后是该文件中包含 grep 搜索内容的文本。
grep 的第一个(非选项)参数可以是一个简单的字符串,也可以是更复杂的正则表达式(regexp)。正则表达式不同于 shell 的模式匹配,尽管两者有时看起来差不多。
常见错误
忘记指定 grep 的输入,例如 grep myvar。这种情况下,grep 会认为你要从 STDIN 提供输入,而你以为它会读取文件,于是 grep 就干等着,无所事事。
2、只显示包含搜索结果的文件名
你需要找出包含特定字符串的文件,但是不想看到其所在的文本行,只用输出文件名即可,经常在线上为了搜索配置文件。
用 grep 的 -l 选项仅显示文件名即可,如下:
$ grep -l myvar *.cboth.cgood.csomio.c$
如果在一个文件中找到了多次匹配,grep 仍然只输出该文件名一次。如果没有找到匹配,则什么都不输出。
由于这些文件包含了你要查找的字符串,如果想据此构建一个待处理
文件的列表,选项 -l 就能派上用场了。将 grep 命令放进 $(),然后就可以在命令行上使用这些文件名了,如下:
rm -i $(grep -l "This file is obsolete" * )
删除包含字符串“This file is obsolete”的文件,我们给 rm 加上了 -i 选项,以便在删除每个文件前都先询问你。
3、不区分大小写搜索
你想要在日志文件中不区分大小写地搜索字符串(如“error”),以匹配该字符串的所有出现。用 grep 的 -i 选项忽略大小写,如下所示:
grep -i error logfile.log
不区分大小写的搜索能够找出包含“ERROR”、“error”、“Error”的日志消息,“ErrOR”和“eRrOr”这样的也不例外。该选项在查找大小写混合的单词时尤其管用,或者对于查找的内容无法确定大小时。
4、缩减搜索结果
如果搜索返回的结果不符合预期,其中包括许多并不需要的内容。将结果通过管道传给 grep -v 并用表达式描述出你不想看到的内容。假设你想在日志文件中找出整个 12 月的日志消息。你知道日志文件用字母缩写 Dec 代表 12 月,但不敢肯定总是如此,为了确保找出所有的日志消息,输入下列命令:
grep -i dec logfile
得到的结果却如下所示:
...error on Jan 01: not a decimal numbererror on Feb 13: base converted to Decimalwarning on Mar 22: using only decimal numberserror on Dec 16 : the actual message you wantederror on Jan 01: not a decimal number...
一种快而糙的解决方案是,将第一次得到的结果通过管道传给另一个grep,由后者过滤掉所有的“decimal”。
grep -i dec logfile | grep -vi decimal
将多个 grep 串联在一起(因为前所未见、出乎意料的匹配会不断出现),逐步过滤搜索结果,直至满意,这种做法并不鲜见。
-v 选项非常方便,你只需要记住该排除什么就行了。
5、搜索更复杂的模式
grep 中的正则表达式提供了更为强大的模式匹配功能,能够满足大部分需求。正则表达式描述了待匹配字符串的模式。字母字符(或者对于 shell没有特殊含义的其他字符)只匹配自身。“A”匹配 A,“B”匹配B,这没什么好说的。另一个重要的规则是按位置组合字母,如 AB匹配“AB”。这看起来也是显而易见的。但是,正则表达式还定义了其他一些特殊字符,它们既可以单独使用,也可以与其他字符结合,从而形成更为复杂的模式。
第一个特殊字符是点号(.),它可以匹配任意单个字符。因此,.... 可以匹配任意 4 个字符;A. 匹配“A”以及紧随其后的任意单个字符;.A. 匹配任意单个字符,然后是“A”,接着是任意单个字符(未必和匹配到的第一个字符相同)。
第二个特殊字符时星号(**),匹配上一个字符的 0 次或多次出现,因此,A* 匹配 0 个或多个“A”字符,.* 匹配 0 个或多个任意字符(如“abcdefg”、“aaaabc”、“sdfgf ;lkjhj”,甚至是空行)。
那么 ..* 是什么意思?它匹配任意单个字符以及紧随其后的 0 个或多个任意字符(也就是一个或多个字符,但不能是空行)。
如下所示,我们知道一行的某些单词,我们想模糊匹配,如下操作:
grep -E "1.*22" 2.text // 匹配1开头,任意个字符后是22
结果如下:
1898090808098822:
Shell 文件查找
1、查找所有的txt文件
文件系统中到处都是 txt 文件。你想将它们集中到一个位置。那么我们该如何做呢?
find 命令可以找出符合要求的所有文件并执行命令,将其移动到指定位置。例如:
find . -name "*.txt" -print -exec mv "{}" /txts \;
find 命令的语法和其他 Unix 命令不同,其选项并不是那种典型的连字符加上单字母,后面再跟上若干参数。find 命令的选项看起来像是简短的单词 1,依照逻辑顺序出现,并描述要查找哪些文件以及如何处理找到的文件(如果存在的话)。这种像单词一样的选项通常称为谓词(predicate)。
find 命令的第一个参数是待搜索的目录。典型用法是用点号(.)代表当前目录,不过你也可以提供一个目录列表,甚至通过指定根目录(/)来搜索整个文件系统(只要权限允许)。
示例中的第一个选项(谓词 -name)指定了要搜索的文件模式。其语法和 bash 的模式匹配语法差不多,因此 *.txt 能够匹配所有以“.txt”结尾的文件名。匹配该模式的文件被认为返回的是真(true),接着将其交给下一个谓词进行处理。
find 会遍历文件系统,将找到的文件名交给谓词测试。如果谓词返回真,就通过。如果返回假,则不再继续往下进行,会接着处理下一个文件名。
谓词 -print 很简单。它总是返回真,同时会将文件名打印到标准输出,因此,能在谓词序列中通过测试而到达这一步的文件都会输出其名称。如果不写,默认会带有这个谓词。
-exec 就有点怪异了。到达这一步的文件名都会变成接下来要执行的命令的一部分。剩下一直到 ; 的这部分就是命令,其中的 {} 会被替换成已查找到的文件名。因此,在上面的例子中,如果 find 在./txt/jazz 子目录中找到名为 1.txt 的文件,那么要执行的命令就会是:
mv ./txt/jazz/1.txt /txts
所有匹配指定模式的文件都会执行命令。如果找到的文件数量众多,那么命令的执行次数自然也不会少。
2、提升已找到文件的处理速度
按照上面的例子,find命令会为每个名字符合要求的文件执行命令,但是当文件过多时命令自然会很慢,那么我们如何提高速度呢?
xargs 命令从标准输入中接收以空白字符分隔(指定 -0 时除外)的文件名,然后对尽可能多的文件(略微少于系统的 ARG_MAX 值,参见 15.13 节)执行指定命令。由于调用其他命令会带来不小的开销,因此使用 xargs 可以显著提升操作速度,因为它能够尽量减少命令的调用次数,而不是每个文件都调用。如下所示:
find . -name "*.txt" -print | xargs mv "{}" /txts;
3、查找文件时不区分大小写
有些 TXT 文件的扩展名是 .TXT,而不是 .txt。查找时该如何兼顾两者?
用 -iname 谓词(如果使用的 find 版本支持)执行不区分大小写的搜索。例如:
find . -iname "*.txt" -print | xargs mv "{}" /txts;
4、按日期查找文件
几个月前,有人给你发了一张 JPEG 图片,你接收后就保存了起来,但现在记不清放哪了。怎样才能找到这张图片呢?
使用 find 命令的 -mtime 谓词来检查文件的最后修改日期。例如:
find . -name "*.jpg" -mtime +90 -print
-mtime 谓词接受一个参数,用于指定要搜索的时间段。90 代表 90天。在数字前使用加号(+90)表明要搜索的文件是在 90 天前修改的。使用减号(-90)表明文件是在 90 天以内修改的。如果既没减号,也没加号,则表明正好就是 90 天。
find 还可以使用逻辑运算符 AND、OR、NOT,如果知道文件修改时间至少在一周(7 天)前,但不超过 14 天,那么就可以像下面这样将两个谓词结合起来。如下所示:
find . -mtime +7 -a -mtime -14 -print
5、按类型查找文件
你正在查找名称中带有单词“java”的目录。先尝试了以下命令。
find . -name "*java*" -print
找到的文件太多了,其中还包括文件系统中所有的 Java 源代码文件。使用 -type 谓词只选择目录。如下:
find . -type d -name "*java*" -print
同样,我们可以使用 -type f指定指查找文件。
我们将 -type d 放在前面,然后是 -name "java"。两者的顺序并不影响最终结果,但将 -type d 放在谓词列表的最前面能略微提高搜索效率:对于碰到的每个文件,先测试其是否为目录,如果是,才测试名称是否符合模式。目录的数量比文件要少一些。因此,这种测试顺序使得大部分文件不用再进一步比较名称了。
6、按内容查找文件
你之前写了一份重要的信件,并将其保存为以 .txt 为扩展名的文本文件,但现在想不起文件名的其余部分了。除此之外,唯一记得的就是信件内容中用到过单词“portend”。那么该如何查找已知部分内容的文件呢?
如果文件就在当前目录下,可以使用简单的 grep 命令。
grep -i portend *.txt
如果还没找到,我们换用一个更完备的解决方案:find 命令。使用其 -exec 选项对满足谓词的文件执行命令。你可以按下列方式使用grep 或其他实用工具:
find . -name "*.txt" -exec grep -Hi portend "{}" \;
或者也可以使用xargs
find . -name "*.txt" | xargs grep -Hi portend
Shell 文本解析awk
1、保留部分输出
你需要用某种方法保留部分输出,丢弃其余输出。比如我们日常线上日志,我们可能会输出很多属性,但是真正能用来解决实际问题的,大多是我们输出的文字信息。以下代码会打印出所有输入行的第一个字段:
awk "{print $1}" myinput.file
字段之间以空白字符分隔。实用工具 awk 从命令行上指定的文件中读取数据,如果没有指定文件,则从标准输入读取。$1代表每行以空格分割后的第一列。
除了上面的写法,我们还可以通过管道传入:
cat myinput.file | awk "{print $1}"
awk 的用法多变。最简单的用法就是从输入中打印出所选的一个或多个字段。字段之间以空白字符分隔(也可以用 -F 选项指定分隔字符),编号从 1 开始。字段 $0代表整个输入行。
2、保留部分输入行
你只想保留部分输入行,例如第一个和最后一个字段。举例来说,你希望 ls 只列出文件名和权限,不需要 ls -l 所提供的其他信息。可惜的是,ls 并没有相应的选项能够按照这种方式限制输出。可以通过管道将 ls 的输出传给 awk,并从中挑选出你需要的字段,如下:
$ ls -l | awk "{print $1, $NF}"total 151130-rw-r--r-- add.1drwxr-xr-x artdrwxr-xr-x bin-rw-r--r-- BuddyIcon.pngdrwxr-xr-x CDsdrwxr-xr-x downloadsdrwxr-sr-x eclipse...$
如果我们用ls -l 命令的输出。其形式如下所示:
drwxr-xr-x 2 username group 176 2026-10-28 20:09 bin
对于 awk 而言,解析这种输出易如反掌(在 awk 中,默认的字段分隔符为空白字符)。
在输出文件名时,我们用了点小技巧。在 awk 中,各种字段是用美元符号和字段编号来引用的(如 $1、$2、$3),而且 awk 还有一个内建变量 NF,其中保存着当前行中的字段总数,$NF总是引用最后一个字段。(例如,ls 的输出行共有 8 个字段,因此变量 NF 的值就是 8,$NF 指向的就是输入行中的第 8 个字段,在这个例子中就是文件名)。
注意:读取 awk 变量时不需要使用 $(这一点和 bash 变量不同)。NF 本身就是一个有效的变量引用。在其之前加上 $ 就将其含义从“当前行的字段总数”改成了“当前行的最后一个字段”。
3、颠倒每行的单词
如果想按照逆序输出输入行中的单词。通过下列脚本:
$ awk "{> for (i=NF; i>0; i--) {> printf "%s ", $i;> }> printf "\n"> }"
字符 > 不用你输入,shell 会输出该字符来提醒你还没有敲完命令(shell 在查找能配对的单引号)。由于 awk 程序位于单引号中,因此 bash shell 允许我们输入多行代码,同时使用 > 作为辅助提示符,直到我们给出与先前匹配的结束单引号。考虑到可读性,我们在程序中加入了空白字符,不过也完全可以写成一行。
$ awk "{for (i=NF; i>0; i--) {printf "%s ", $i;} printf "\n"}"
awk 语言的 for 循环语法和 C 语言中的非常相似。我们用 for 循环从最后一个字段开始倒着处理到第一个字段,同时输出每个字段的内容。
4、汇总数字列表
如果你需要汇总数字列表,其中有些数字并未出现在行中。用 awk 先过滤出待汇总的字段,然后再做汇总。这里我们要对 ls -l 命令输出的文件大小进行汇总。如下:
ls -l | awk "{sum += $5}; END {print sum}"
我们要汇总 ls -l 输出的第 5 个字段。ls -l 的输出如下所示:
-rw-r--r--. 1 root root 37 12月 23 21:44 2.text -rwxr--r--. 1 root root 110 12月 10 02:20 ifTest.sh
各个字段分别为:权限、链接、所有者、所属组、大小(以字节为单位)、最后一次修改日期、最后一次修改时间,以及文件名。我们只对文件大小感兴趣,因此在 awk 程序中用 $5 来引用该字段。我们在花括号({})里放置了两段 awk 代码,注意,awk 程序中可以有多个代码段(或代码块)。前有关键词 END的代码块仅在程序其他部分完成后运行一次。
本文由
传智教育博学谷
教研团队发布。如果本文对您有帮助,欢迎
关注
和点赞
;如果您有任何建议也可留言评论
或私信
,您的支持是我坚持创作的动力。转载请注明出处!
别催了,别催了,这篇文章我一次性把Shell的内容说完
环球观点:AMD RDNA3显卡架构底层细节公开!606页 应有尽有
前沿资讯!微信隐藏功能无了!群空间助手小程序宣布3月下线:号称永久保存
世界滚动:腾讯优酷后!爱奇艺限制投屏 会员只能看480P:专家发声 用户只能接受
环球快看点丨SUV比亚迪卖爆!榜一大哥月销7万+、一代神车没落
《黑豹2》女主演利蒂西娅·赖特:续集已在计划中
头条:疑似零跑C11路边停车起火 车尾疯狂往外喷火
男子开豪车带马狗羊回家过年 它们都是自己的家人:画面让网友难受
公交司机边开车边抠脚引乘客担忧 官方回应:会研究处理
焦点短讯!这些是最热门的机器学习方法!
【播资讯】通过事件总线EventBus/AsyncEventBus进行JAVA模块解耦 (史上最全)
内存、SSD价格雪崩 韩国芯片双雄终于顶不住了?
又一日系品牌拥抱比亚迪 铃木EVX概念车首发:用上刀片电池
全球视点!美国最大私人地主 大量买地引质疑!比尔盖茨回应:只为提高产量
国产家轿又一“黑马”诞生 长安逸达首发亮相
原长城汽车总裁王凤英将出任小鹏CEO 接替何小鹏?内部回应
围棋哪个国家最强?围棋哪个颜色先下?
都挺好苏明成知道自己不是亲生的是第几集?都挺好的结局是什么?
魂来枫林青的下一句是什么?魂来枫林青是什么意思?
李宁标志刺绣是真的吗?李宁标志设计含义
美的净水器好不好?净水器哪个牌子质量好性价比高?
ios7输入法怎么设置成搜狗?ios7输入法打不出汉字怎么办?
怎么修改系统启动项?修改系统启动项的方法有哪些?
新资讯:MySQL间隙锁、行锁的读写阻塞实验
win8如何找到硬件驱动程序?win8怎么进入安全模式?
港利通手机怎么样?港利通手机怎么恢复出厂设置密码?
当前播报:推特广告收入下跌严重:考虑出售15亿用户名创收
今日看点:春节正常发货:仁和N95灭菌级口罩25片15.9元发车
【全球独家】跟上Windows本步伐!苹果正开发触摸屏Mac笔记本:最早2025年发布
秒变战神!杰士邦延时避孕套大促:立减200元 不到20到手
全球新动态:文件出台!车险价格最高可再降23% 开车越稳越便宜
天天报道:TapTap 算法平台的 Serverless 探索之路
我用AI去讨债:一顿操作猛如虎 3000要回350
环球观察:不止投屏缩水 爱奇艺蓝光码率仅蓝光碟1/13 1080P也糊
4999元限量发售!雷军:小米13定制色水泥灰卖的最好
焦点关注:育碧《怒海战记》再度延期
网速比5G提升100倍 2023年我国将全面推进6G技术研发
环球热议:读编程与类型系统笔记05_函数类型
天天资讯:关于 Serverless 应用架构对企业价值的一些思考
焦点热文:男子高速撞鸟 鸟腿成三叉戟立标 丰田秒变“玛莎拉蒂”
世界关注:解除屏蔽!微信已可正常跳转抖音链接
环球最资讯丨造车新势力第一 广汽埃安宣布将涨价:最高涨6000元
全球今亮点!称雷军是导师、大哥 何小鹏:但不想成为他 太累了
每日热文:郭明錤:iPhone 15 Pro将搭载“固态按键” 取消实体键
【播资讯】东北夫妻去三亚 为省8千机票开电车3600公里 充11次电 比油便宜
新资讯:9499元割韭菜!厂商喷RTX 4080太贵 惹怒NV后帖子删除:用户叫好
短讯!24岁湖北小伙搭17个顺风车到格鲁吉亚求婚引羡慕:女子同意 结婚不要彩礼
全球速递!美国航空局系统故障 致全美航班停飞:已有8609架次延误 1251架次取消
每日快看:失灵事故再现?特斯拉刹车又出问题:八车连环相撞!这次不一样
【全球新视野】洛谷P1040. 加分二叉树
C#、TS和Dart对比2:变量和作用域
电脑故障影响数千架次航班!全美航班停飞限制取消
灵动岛只是过渡品!iPhone 16或配备屏下Face ID
当前要闻:小米将参加MWC2013:不会发布小米13 Ultra
弄疯了无数人的游戏:差点让我砸掉显示器!
焦点消息!登录、投屏处处受限!视频平台被指吃相难看 你还开会员吗?
网址导航
全球看点:P2448 无尽的生命
[概率论与数理统计]笔记:3.3 随机向量的函数的分布与数学期望
世界新资讯:React核心概念与JSX
热消息:伊利回应30支冰糕分30箱发货 被网友吐槽太浪费:订单推送失误造成
全球热点!网友拿到了一加11:真的跟老板说的一样巨流畅
mac下php环境搭建
天天快讯:MQ——如何保证消息不会丢失
144MB缓存游戏神U!AMD锐龙7000X3D定档:情人节大礼
【当前热闻】美国所有航班都已停飞 电脑系统竟突发故障:官方给出恢复时间
速看:偶数位(熟悉二进制)
当前信息:Mysql页分裂
焦点关注:日系首款电动B级轿车!本田雅阁插混版来了:可挂绿牌
广州一宝马SUV冲撞人群 官方通报:已致5死13伤 司机被控制
环球即时:太阳4天内发出两次X级耀斑:几天后指向地球、或引强烈地磁暴
世界视点!02-Sed语法介绍
每日聚焦:真我GT Neo5标准版曝光:不到200g机身塞进5000mAh和骁龙8+
天天微头条丨I Do钻戒母公司被申请破产:被年轻人摒弃 太不保值 有人1.8万买只值180元
新款魏牌拿铁DHT-PHEV亮相惹争议 网友吐槽:不能我一个人瞎
CQOI2007,洛谷P4710涂色
头条焦点:小米最好高端口碑!雷军:MIX Fold 2研发成本很高 屏幕是天价定制
奢侈服装品牌Acne新春广告片被批 网友称其“阴间兔”
男童放鞭炮炸飞井盖连砸两车 科普:炮仗遇上下水道堪比小炸弹
【环球播资讯】男子吐槽APP看天气预报要点8个广告 网友:手机自带的不好吗?
世界快看点丨雅迪参展CES:汽车级快充亮相 20分钟充满80%电池
全球快看点丨链表栈队列递归哈希表有序表
Codeforces 1278 F Cards 增强版 题解 (斯特林数,推式子)
热点在线丨sortablejs 列表拖拽排序,js vue2,解决拖拽排序乱序问题
世界快资讯:用低代码这把“剑”之前,要先看定位,各取所需
当前短讯!开源动物行为分析实验箱(斯金纳箱)研发总结
三星Galaxy S24系列或取消Plus版本:销量太惨淡
【天天时快讯】大碗更尽兴!海福盛香辣牛肉面大促:每桶到手3块钱
今日视点:特斯拉2022年中国销量44万辆 还不敌比亚迪一个宋
《咬文嚼字》公布年度十大语文差错:连花清瘟?莲花清瘟?
世界观焦点:荣耀二代骁龙8新机来了!Magic 5系列入网:春节后发布
环球观速讯丨python之路 58 linux文件配置相关
学习笔记——MyBatis自动映射与自定义映射;Mybatis延迟加载
当前关注:C#、TS和Dart对比1:概述
即时焦点:SpringBoot Xss漏洞修复
软件开发入门教程网之Git 基本操作
热门:别克GL8危险!腾势D9累计订单超5万:50%用户来自BBA
3岁男童反复呕吐被确诊癌症晚期:被称为儿童癌症之王
当前速读:《咬文嚼字》公布2022年度十大语文差错:天和核心舱、莘莘学子上榜
努比亚Z50限定版明天首销:搭载最纯净的定制系统 无广告