grep使用

本文详细介绍了grep命令的使用,包括基本用法、选项如-v、-i、-o、-E,正则表达式的应用,如锚定、字符匹配、次数匹配等,并给出了一系列的实际操作示例,如查找特定用户、匹配数字模式、提取路径的基名等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

shell脚本:文本文件
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl

grep 文本过滤器
-v:显示不能被匹配到的行
-i:忽略字符大小写
-o:仅显示匹配到的字符串
-E:使用扩展正则表达式(ERE)

\{m\}:匹配前面的字符m次;   grep '\{m\}'  a.txt
\{m,n\}:匹配前面的字符至少m次,至多n次;
\{m,\}:匹配前面的字符至少m次;

位置锚定:
    ^:行首锚定
    $:行尾锚定
    ^PATTERN$:用于模式匹配的行
        ^$:空行
        ^[[:space:]]*$ 匹配空格

BRE:基本正则表达式
    字符匹配:.单个字符  []范围内单个字符  [^]除...外单个字符
    [[:digit:]]表示所有数字
    [[:lower:]]所有小写字符
    [[:upper:]]所有大写字符
    [[:alpha:]]所有字符
    [[:alnum:]]所有字符及数字
    [[:punct:]]所有标点符号
    [[:space:]]空格
    次数匹配: *  \?0次或1次  \+至少一次  \{m\}至少m次  \{m,n\}
    位置锚定:^  $  \<  \b  \>  \b
    分组: \(\)  将一个或多个字符捆绑在一起,当作一个整体进行处理
            例如:\(xy\)*ab
    Note:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命令方式为\1,\2,\3....
    \1:从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
    例如:\(ab\+\(xy\)*\)
    \1:ab\+(\xy\)*   #表示一个变量
    \2:xy
    后向引用(引用前面的分组括号中的模式所匹配的字符):\1,\2,...
            
练习:
1.如果root用户存在,显示其默认的shell程序:
grep "^root\>" /etc/passwd > /dev/null &&  grep "^root\>" /etc/passwd | cut -d: -f7

2.找出/etc/passwd中的两位数或三位数:
grep "\<[0-9]\{2,3\}\>" /etc/passwd

3.显示/etc/rc.d/rc.sysinit文件中,至少以一个空白字符开头的且后面存在非空白字符的行
grep "^[:space:]\+[^[:space:]]" /etc/rc.d/rc.sysinit

4.找出"netstat -tan"命令的结果以"LISTEN"后跟0、1或多个空白字符结尾的行
netstat -tan | grep "LISTEN[[:space:]]*$" #[[:space:]]表示空格

5.添加用户bash testbash basher以及nologin(其shell为/sbin/nologin):而后找出/etc/passwd文件中用户名同shell名的行
grep "^\([[:alnum:]]\+\>\).*\1$" /etc/passwd  #[[:alnum:]]表示仅看数字及字符串  "\(\)"里面的内容为一组

6.写一个脚本,实现
如果user1用户存在,就显示其存在,否则添加该用户;显示添加的用户的id号等信息
#!/bin/bash
id user2 &> /dev/null && echo 'user2 is exists!'  || useradd user2  #“&”表示如果为真则执行  “&&”表示并且,即前一步成功才执行,否则不执行 “||”表示否则 即前面不为真则执行
id user2

7.如果root用户登录的当前系统,就显示root用户在线,否则说明其未登录;
grep "root\>" &>/dev/null && echo "root login" || echo"root is not login in"  

egrep
-v:显示不能被匹配到的行
-i:忽略字符大小写
-o:仅显示匹配到的字符串


目录名 dirname 是目录的路径
#dirname /etc/sysconfig/network-scripts/
/etc/sysconfig

基名 basename 是最后的路径
#basename /etc/sysconfig/network-scripts/
network-scripts
 
1.显示当前系统root、centos或user1用户的默认shell和UID
grep -E '^(root|centos|user1)\>' /etc/passwd | cut -d: -f1,3,7

2.找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行
grep -E -o '[_[:alpha:]]+\(\)' /etc/rc.d/init.d/functions

3.使用echo输出一绝对路径,使用egrep取出其基名
echo /etc/sysconfig/network | grep -E -o "[^/]+$"

4.找出ifconfig命令结果中的IP地址
ifconfig  | grep "Bcast" | cut -d: -f2| cut -d " " -f1
ifconfig  | grep "Bcast" | cut -d: -f2| awk '{print $1}'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值