grep 中要正确匹配tab(退格)符有两种方式

其实在linux中要正确匹配tab(退格)符有两种方式

1:用 grep  $'\t'       你的文件

2:用 grep '按CTRL+V 键,再按TAB键'      你的文件

再回到上面的问题,则可以用以下的命令

cat delete.log |grep $'\t'11$'\t' |wc

或者

cat delete.log |grep ‘CTRL+V,TAB11CTRL+V,TAB’|wc

 

 

转自:http://www.linuxidc.com/Linux/2011-11/47000.htm

<think>我们正在讨论的是Linux中grep和find命令在正则匹配里使用`*`的区别。 根据之前的引用和用户的问题,我们需要区分两点: 1. find命令本身的正则匹配(使用-regex选项)中的`*`含义 2. grep命令正则表达式中的`*`含义 同时,我们还要注意find命令默认使用的是glob模式(通配符)而不是正则表达式,但用户问的是正则匹配,所以我们需要特别说明find的-regex选项。 首先,需要明确: - find命令的`-name`参数使用的是shell glob模式(通配符),其中`*`匹配任意数量的任意字符(包括零个)。 - find命令的`-regex`参数使用的是正则表达式(默认是emacs风格的正则),其中`*`表示前面的字符出现零次或多次。 - grep命令默认使用的是基本正则表达式(BRE),其中`*`表示前面的字符出现零次或多次;使用`-E`选项时,则是扩展正则表达式(ERE),`*`的含义相同。 因此,同一个`*`在find的正则匹配(-regex)和grep的正则表达式中含义相同,都是正则表达式中的量词(匹配前面字符0次或多次)。但是,在find的`-name`参数中(这是find命令最常用的匹配模式),`*`是通配符,其含义与正则表达式中的`.*`类似(但正则表达式中的点表示任意单个字符,而通配符中的`*`直接匹配任意多个字符)。 用户的问题是:grep和find正则匹配里`*`的区别。所以重点在正则匹配。 具体分析: 1. find的正则匹配(-regex)中的`*`: - 在正则表达式中,`*`是一个量词,表示前面的字符(或子表达式)出现0次或多次。 - 例如:`a*`可以匹配空字符串、'a'、'aa'等。 - 注意:在find的正则匹配中,默认整个路径都会被匹配,所以如果要匹配文件名,需要精确设计正则表达式。 2. grep的正则表达式中的`*`: - 在grep的基本正则表达式(BRE)和扩展正则表达式(ERE)中,`*`都是量词,含义与上述相同。 - 例如:`grep "a*" file` 会匹配所有行(因为空字符串也被匹配),而`grep "aa*" file` 会匹配至少包含一个'a'的行(因为第一个a是必须的,第二个a可以出现0次或多次,所以匹配'a', 'aa', 'aaa', ...)。 但是,需要注意的是,在find的`-name`参数(这是常用的,但不是正则匹配)中,`*`是通配符,匹配任意多个字符。而用户问题明确提到“正则匹配”,所以我们不用讨论`-name`。 然而,用户可能会混淆find的`-name`和`-regex`,所以我们有必要在回答中明确指出。 因此,我们的回答结构如下: 1. 解释find命令的正则匹配(通过`-regex`选项)中`*`的含义。 2. 解释grep命令正则表达式中`*`的含义。 3. 对比两者在正则匹配中`*`的相同点(都是量词,表示0次或多次)。 4. 指出find命令的常用匹配(`-name`)使用的是通配符,其中的`*`与正则中的`*`不同(这里简单说明,因为用户问的是正则匹配,所以重点在正则)。 另外,根据用户之前的问题,他们可能还关心使用示例,所以我们给出一些简单的示例。 同时,我们还要注意用户提到的引用[1]和引用[2],其中提到: - find用于在目录中查找文件或目录 - grep用于在文件中查找字符串 所以,我们还要强调两个命令用途的不同,但问题聚焦在正则匹配中`*`的区别。 最后,生成相关问题。 回答如下: </think>### Linux 中 `grep` 与 `find` 正则匹配中 `*` 的区别解析 在 Linux 中,`grep` 和 `find` 虽然都支持正则匹配,但二者在使用 `*` 时有本质差异。区别主要源于 **命令设计目标** 和 **底层引擎** 的不同: | 特性 | `find` 命令的 `*` | `grep` 命令的 `*` | |--------------|---------------------------------------|---------------------------------------| | **核心用途** | 匹配**文件名/路径** | 匹配**文件内容** | | **语法类型** | Shell 通配符(Globbing) | 正则表达式(Regular Expression) | | **`*` 含义** | 匹配任意长度字符(包括空字符) | 匹配前一个字符**0次或多次** | | **作用域** | 作用于文件名整体(如 `*.txt`) | 作用于字符级(如 `a*` 匹配 `a`,`aa`) | | **示例命令** | `find . -name "*.txt"` | `grep "error.*log" file.txt` | --- #### 1. **`find` 中的 `*`:文件名通配符** 在 `find -name` 参数中,`*` 属于 **Shell 通配符**(非正则表达式): - **匹配逻辑**:直接替换整个片段 例如 `*.txt` 等价于: $$\\{ f \mid f = \\text{任意字符串} + \text{".txt"}\\}$$ - **示例**: ```bash # 查找所有 .conf 文件(匹配完整文件名) find /etc -name "*.conf" ``` - **限制**: 不支持正则元字符(如 `.` `+` `?`),`*` 不能单独修饰字符 --- #### 2. **`grep` 中的 `*`:正则表达式量词** 在 `grep` 中,`*` 是**正则表达式引擎**的组成部分: - **匹配逻辑**:修饰前一个字符的出现次数 数学表达: 设字符集 $C$,则 $c^* = \\{ \epsilon, c, cc, ccc, ... \\}$ ($\epsilon$ 为空字符) - **示例**: ```bash # 匹配 "err" + 0个或多个"o" + "r"(如 error, errr) grep "erro*r" logfile.txt ``` - **高级用法**: 需配合其他元字符使用,如: - `.*` → 匹配任意字符任意次数(不含换行符) - `[a-z]*` → 匹配连续小写字母 --- ### 关键差异总结 1. **元字符转义需求不同** - `find -name "*.txt"` → `*` 无需转义 - `grep "a\*b"` → 若需匹配字面 `*` 需转义(`\*`) 2. **上下文作用范围** ```mermaid graph LR A[find] --> B["作用于路径<br>(如 /home/*.txt)"] C[grep] --> D["作用于文本行<br>(如 line: error*)"] ``` 3. **正则引擎开关** - `find` 需 `-regex` 才启用真正正则(此时 `*` 等同于 `grep`) ```bash # 使用真正正则(匹配含数字的 .txt 文件) find . -regex ".*[0-9]+\.txt" ``` - `grep` 默认支持基础正则(`-E` 启用扩展正则) > 简言之:`find` 的 `*` 是**通配符**(匹配文件名),`grep` 的 `*` 是**量词**(修饰前字符)[^1][^2]。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值