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如何使用正则表达式命令?文本文件操作命令的主要内容,如果未能解决你的问题,请参考以下文章