当前位置: 首页 > 科技观察

Linux进阶必学知识:什么是grep?如何使用?

时间:2023-03-13 16:33:25 科技观察

经常看一些介绍unix命令的文章,但是文章中给出的例子一般价值不大,导致我们看了文章不知道如何有效的使用这些unix命令。写在前面三年前,作为面试官,我负责招聘Unix系统管理员。一共有8个人来竞争这个职位,其中有两个人是技术先进的自由职业者。我认为系统管理员不需要记住所有的配置方法。当你需要某个软件的时候,只要你想玩玩,玩的爽一点,多看一些文章,自然而然就熟悉了。各种用途和配置。于是,我让这些考生解决了以下两个问题:创建一个例行任务,在每个偶数点(比如2点、12点)和3点执行;通过/var/run/dmesg.boot文件设备信息打印处理。令我意外的是,8位应聘者无一能解决上述问题,其中有两人对grep命令一窍不通。在这之间,让我们谈谈grep。首先,以下所有操作均基于grep2.5.1-FreeBSD:#grep--version|grepgrepgrep(GNUgrep)2.5.1-FreeBSD有必要先说明一下grep的版本,因为有些用法仅限于特定的版本:#mangrep|grep-iB2freebsd-P,--perl-regexp将PATTERN解释为Perl正则表达式。FreeBSD不支持此选项。好吧,事不宜迟,我们经常这样grep文件:root@nm3:/#cat/var/run/dmesg.boot|grepCPU:CPU:IntelCore(TM)2QuadCPUQ9550@2.83GHz(2833.07-MHzK8-classCPU)也这样做:root@nm3:/#grepCPU:/var/run/dmesg.bootCPU:IntelCore(TM)2QuadCPUQ9550@2.83GHz(2833.07-MHzK8级CPU)这也是可能的(虽然我讨厌这种做事方式):root@nm3:/#'test.txt七八一八三十六十七十八十七二十七二十二十七如果你想搜索以特定字符开始(结束)的行,你可以这样做:root@nm3:/#grep'^seven'test.txt七八一八threeroot@nm3:/#grep'seven$'test.txt十六十七十八七二十七twentysevenroot@nm3:/#想要显示目标行的上下文?root@nm3:/#grep-C1twentyseventest.txt#commentUPtwentyseven#commentdown显示的是上面还是下面?root@nm3:/#grep-A1twentyseventest.txttwentyseven#commentdownroot@nm3:/#grep-B1twentyseventest.txt#commentUPtwentyseven我们也可以这样玩grep:root@nm3:/#格雷p"twenty[1-4]"test.txttwenty1twenty3ornegate:root@nm3:/#grep"twenty[^1-4]"test.txttwenty7twentyseventwenty5twenty7grep是一个强大的命令,除了上面的除了列出的之外,它还支持许多限定符、通配符和正则表达式以下是一些示例:root@nm3:/#cat/etc/resolv.conf#optionsedns0#nameserver127.0.0.1nameserver8.8.8.8nameserver77.88.8.8nameserver8.8.4.4仅获取与IP地址相关的行:root@nm3:/#grep-E"[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}"/etc/resolv.conf#nameserver127.0.0.1nameserver8.8.8.8nameserver77.88.8.8nameserver8.8.4.4上面的方法可以,但是下面的方法更好:root@nm3:/#grep-E'b[0-9]{1,3}(.[0-9]{1,3}){3}b'/etc/resolv.conf#nameserver127.0.0.1nameserver8.8.8.8nameserver77.88.8.8nameserver8.8.4.4希望去掉评论行?root@nm3:/#grep-E'b[0-9]{1,3}(.[0-9]{1,3}){3}b'/etc/resolv.conf|grep-v'#'名称服务器8.8.8.8名称服务器77.88.8.8名称服务器8.8.4.4只有IP:root@nm3:/#grep-oE'b[0-9]{1,3}(.[0-9]{1,3}){3}b'/etc/resolv.conf|grep-v'#'127.0.0.18.8.8.877.88.8.88.8.4.4哎呀,注释掉的127.0.0.1又回来了,这是指令的错误它是如何中断的?root@nm3:/#grep-v'#'/etc/resolv.conf|grep-oE'b[0-9]{1,3}(.[0-9]{1,3}){3}b'8.8.8.877.88.8.88.8.4.4让我们看看-v(反向查找)选项。假设你想执行命令“ps–afx|grepttyv”:root@nm3:/#ps-afx|grepttyv1269v1Is+0:00.00/usr/libexec/gettyPcttyv11270v2Is+0:00.00/usr/libexec/gettyPcttyv21271v3Is+0:00.00/usr/libexec/gettyPcttyv31272v4Is+0:00.0/usr/libexec/gettyPcttyv41273v5Is+0:00.00/usr/libexec/gettyPcttyv51274v6Is+0:00.00/usr/libexec/gettyPcttyv61275v7Is+0:00.00/usr/libexec/gettyPcttyv7487982S+0:00.00grepttyv好的,但是我们不需要“487982S+0:00.00grepttyv”这一行,使用-v:root@nm3:/#ps-afx|grepttyv|grep-vgrep1269v1Is+0:00.00/usr/libexec/gettyPcttyv11270v2Is+0:00.00/usr/libexec/gettyPcttyv21271v3Is+0:00.00/usr/libexec/gettyPcttyv31272v4Is+0:00.00/usr/libexec/gettyPcttyv41273v5Is+0:00.00/usr/libexec/gettyPcttyv51274v6Is+0:00.00/usr/libexec/gettyPcttyv61275v7Is+0:00.00/usr/libexec/gettyPcttyv7看起来很糟糕?现在怎么办?root@nm3:/#ps-afx|grep"[t]tyv"1269v1Is+0:00.00/usr/libexec/gettyPcttyv11270v2Is+0:00.00/usr/libexec/gettyPcttyv21271v3Is+0:00.00/usr/libexec/gettyPcttyv31272v4Is+0:00.00/usr/libexec/gettyPcttyv4v5Is+0:00.00/usr/libexec/gettyPcttyv51274v6Is+0:00.00/usr/libexec/gettyPcttyv61275v7Is+0:00.00/usr/libexec/gettyPcttyv7不要忘记|(或)符号:root@nm3:/#vmstat-z|grep-E"(sock|ITEM)"ITEMSIZELIMITUSEDFREEREQFAILSLEEPsocket:696,130295,30,65,43764,0,0不同的路由导致相同的目标:root@nm3:/#vmstat-z|grep"sock|ITEM"ITEMSIZELIMITUSEDFREEREQFAILSLEEPsocket:696,130295,30,65,43825,0,0许多人在grep中使用正则表达式,但是你仍然忘记使用POSIX字符集,尽管它们非常有用POSIX:[:alpha:]任何字母字符,不区分大小写[:digit:]任何数字字符[:alnum:]任何字母或数字字符[:blank:]空格或制表符[:xdigit:]十六进制字符;任何数字或A–F或a–f[:punct:]任何标点符号[:print:]任何可打印字符(非控制字符)[:space:]任何空白字符[:graph:]排除空白字符[:upper:]任何大写字母[:lower:]任何小写字母[:cntrl:]控制字符查找带有大写字母的行:root@nm3:/#grep"[[:upper:]]"test.txt#commentUP搜索结构不够抢眼?突出显示:更多grep技巧。第一个稍微专业一点,我15年没用了。选择包含六七八的行,很简单:root@nm3:/#grep-E"(six|seven|eight)"test.txt七八一八三十六十七十八十七十七十六十七十八二十七二十七然后现在多次只选择包含六、七或八的行。这个用法叫做backreferencing:root@nm3:/#grep-E"(six|seven|eight).*1"test.txt七八一八三十六十七十八七第二招,这个比较有用.打印504前后带制表符的行(如果PCRE能支持这个功能就好了)。此处POSIX字符集无效:root@nm3:/#grep"[[:blank:]]504[[:blank:]]"test.txtone504oneone504oneone504one[CTRL+V][TAB]Takeeffect:root@nm3:/#grep"504"test.txtone504one我错过了什么吗?grep具有递归搜索文件/目录的功能。如果我们想在源码目录中搜索允许Intel使用外部SFP的代码,但是没有清楚完整地记住函数名allow_unsupported_stp和unsupported_allow_sfp。该怎么办?这正是grep的用途:root@nm3:/#grep-rniallow/usr/src/sys/dev/|grepunsupp/usr/src/sys/dev/ixgbe/README:75:ofunsupportedmodules通过设置静态变量'allow_unsupported_sfp'/usr/src/sys/dev/ixgbe/ixgbe.c:322:staticintallow_unsupported_sfp=TRUE;/usr/src/sys/dev/ixgbe/ixgbe.c:323:TUNABLE_INT("hw.ixgbe.unsupported_sfp",&allow_unsupported_sfp);/usr/src/sys/dev/ixgbe/ixgbe.c:542:hw->allow_unsupported_sfpallow_unsupported_sfp=allow_unsupported_sfp;/usr/src/sys/dev/ixgbe/ixgbe_type.h:32allow_unsupported_sfp;/usr/src/sys/dev/ixgbe/ixgbe_phy.c:1228:if(hw->allow_unsupported_sfp==TRUE){希望大家不要晕,因为这些grep的用法只是grep的冰山一角!***祝大家愉快!原文链接:http://outofmemory.cn/wr/?u=http%3A%2F%2Fwww.techug.com%2F