Linux如何使用正则表达式命令?文本文件操作命令

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux如何使用正则表达式命令?文本文件操作命令相关的知识,希望对你有一定的参考价值。

参考技术A

Linux对文本操作命令及正则表达式:

cat

cat 是 concatenate 的缩写,所以它的作用其实是连接文件。但默认情况下它会将连接文件的结果送到标准输出。所以我们常用来显示文件内容。类似于 dos 中的 type。

more

当一个文件的内容超过一屏后,我们可以用 more 这个指令来逐屏 察看 文件内容。

less

less 在 more 的基础上,更可以逐行 察看 ,前后翻页。

head

head 显示文件开头部分内容,默认显示前十行参数 --lines 或者 –n 指明显示行数基本格式:

tail

tail 显示文件结尾部分内容,命令用法同 head,参数 -f 显示文件的纪实更新,用于监视日志文件

tail 默认显示文件列表中每个文件的后 10 行,如果没有文件名或文件名为“-”则其从标准输入中读取文件,如果有多个文件则其会在文件前面加上“==>文件名<==”以便区别。

# tail /etc/mail/sendmail.mc 默认查看文件的后 10 行内容

# tail –n 20 /etc/passwd 查看文件后 20 行内容

注意: # tail –f /var/log/message 实时监控日志文件更新信息,非常重要

diff

diff 用于比较两个文件之间的区别,并送到标准输出。输出时先报告两个文件的哪一行不同。基本格式:

参数:

uniq 用于去除文本中相邻的重复行。

-u 参数可以只显示那些没有被重复过的行。 -d 显示有被重复过的行。

cut

cut 可以根据一个指定的标记(默认是 tab)来为文本划分列,然后将此列显示。使用权限:所有使用者

基本格式: cut -cnum1 -num2 filename

说明:显示每行从开头算起 num1 到 num2 的文字。

[root@uplooking root] $ cut –f1 –d: /etc/shadow 表示以 : 为分隔符,显示 /etc/shadow 的第一列 sort

sort 用来按各种需要重新排列文本,一般运用在一个管道之后。例如:

默认情况下 sort 按照字母顺序排列文本。

wc

wc 用来统计一个文件的行数、词数、字数并送到标准输出。也可以用-l(行数)、-w(词数)、-c(字数)来指定输出内容。

如何过滤文本文件中以大写字母开头并以正整数结尾的行,并在 linux 的命令行上使用正则表达式?

【中文标题】如何过滤文本文件中以大写字母开头并以正整数结尾的行,并在 linux 的命令行上使用正则表达式?【英文标题】:How do I filter lines in a text file that start with a capital letter and end with a positive integer with regex on the command line in linux? 【发布时间】:2022-01-22 12:07:16 【问题描述】:

我正在尝试在 linux 终端中将 Regex 与 grep 命令一起使用,以便过滤文本文件中以大写字母开头并以正整数结尾的行。有没有办法修改我的命令,以便它在一行中通过一次调用 grep 而不是两次来完成这一切?我正在为 linux 和 microsoft store ubuntu 使用 windows 子系统。

文本文件:

C line 1
c line 2
B line 3
d line 4
E line five

我开始工作的命令:

grep ^[A-Z] cap*| grep [0-9]$ cap*

输出

C line 1
B line 3

这可行,但我觉得正则表达式可以以某种方式组合,但是

grep ^[A-Z][0-9]$ 

不会产生与上述命令相同的结果。

【问题讨论】:

grep [0-9]* 没有意义,它匹配任何字符串。 grep ^[A-Z] cap*grep ^[A-Z] cap*| grep [0-9]* 一样,你可能是说 grep '^[A-Z].*[0-9]' cap* grep '^[A-Z].*[0-9]$' 应该可以工作 哇,谢谢。我编辑了这个问题,以使我的初衷对后代更清楚。你们提出的解决方案对我的目的非常有效!谢谢, 【参考方案1】:

你需要使用

grep '^[A-Z].*[0-9]$'
grep '^[[:upper:]].*[0-9]$'

请参阅online demo。正则表达式匹配:

^ - 字符串开头 [A-Z] / [[:upper:]] - 大写字母 .* - 任何零个或多个字符([^0-9]* 匹配零个或多个非数字字符) [0-9] - 一个数字。 $ - 字符串结束。

另外,如果要确保字符串末尾的数字之前没有-,则需要使用否定括号表达式,例如

grep -E '^[[:upper:]](.*[^-0-9])?[1-9][0-9]*$'

这里,POSIX ERE 正则表达式(由于-E 选项)匹配

^[[:upper:]] - 开头的大写字母,然后 (.*[^-0-9])? - 任何文本的可选出现,然后是除数字和 - 之外的任何字符 [1-9] - 非零数字 [0-9]* - 零个或多个数字 $ - 字符串结束。

【讨论】:

这将错误地匹配C line 1 X。您需要锚定到行尾。 @WilliamPursell 我更专注于增强最初的尝试而不是需求。可能,正则表达式应该以 [^-0-9][0-9][0-9]*$ 或类似结尾。 我认为这需要两个调整。首先,它不会匹配像“F6”这样的行,它只是一个字符和一个中间没有任何内容的数字。其次,它自己匹配数字“0”,并且发布者想要正整数。这对我有用:grep -E '^[[:upper:]](.*[^-0-9])?[1-9][0-9]*$' 如果这解决了您的问题,请考虑接受它。或者,您可以发布自己的答案并接受。接受答案通过将问题标记为已解决来帮助未来的访问者。另见help.【参考方案2】:

当您使用管道时,您希望第二个 grep 作用于标准输入,而不是作用于您最初 grep 的文件。

grep ^[A-Z] cap*| grep [0-9]$

但是,如果要排除负数,则需要扩展第二个正则表达式。无论如何,一个更好的解决方案可能是切换到 Awk:

awk '/^[A-Z]/ && /[0-9]$/ && $NF > 0' cap*

输出格式会与grep略有不同;如果要包含匹配文件的名称,则必须单独指定:

awk '/^[A-Z]/ && /[0-9]$/ && $NF > 0  print FILENAME ":" $0 ' cap*

正则表达式^[A-Z][0-9]$ 正好匹配两个字符,第一个必须是字母,第二个必须是数字。如果你想允许它们之间的任意文本,那就是^[A-Z].*[0-9]$(为了不那么随意,使用比.*更具体的东西,比如(.*[^-0-9])?,你需要grep -E作为括号和问号表示可选,或反斜杠前面的反斜杠表示您使用 POSIX grep 开箱即用的 BRE 正则表达式方言。

【讨论】:

以上是关于Linux如何使用正则表达式命令?文本文件操作命令的主要内容,如果未能解决你的问题,请参考以下文章

Linux正则表达式

linux中grep和find的区别

Linux 命令合集 文本处理和正则表达式相关命令之五

Linux正则表达式

Linux命令过滤文本 grep

awk 系列:如何使用 awk 和正则表达式过滤文本或文件中的字符串