【问题标题】:Linux grep only n,m character stringsLinux grep 仅 n,m 个字符串
【发布时间】:2017-04-19 12:46:44
【问题描述】:

我有一个包含以下内容的文件,

TESTING
TSET24D
DSWEDFBG
WTSETO
MSDWEHLKGY

并且只想 grep 字符串长度为 6 和 8 个字符。

我试过下面的,

[root@server ~]# cat listfile | grep -o -w -E '^[[:alnum:]]{6,8}'
TESTING
TSET24D
DSWEDFBG
WTSETO
[root@server ~]#

这似乎可以在某些服务器上运行,并且它还会返回 6-8 之间的字符串。

请给个意见..

【问题讨论】:

  • 你不需要cat文件,grep会为你读取文件。

标签: linux awk grep


【解决方案1】:

在您的正则表达式中,{6,8} 会查找 6 到 8 次之间的重复(因此包括 7 次)。您需要使用管道(正则表达式中的 OR)将搜索拆分为 6 或 8 次。

$ grep -o -w -E '^[[:alnum:]]{6}|^[[:alnum:]]{8}' listfile
DSWEDFBG
WTSETO

【讨论】:

  • 只需添加$s 即可锚定它。
  • @EdMorton 纠正我的错误,但 -w 选项不这样做吗?
  • 好点,那么您也不需要^ 锚。所以你要么需要(^$)或(-w-x)。你也不需要-o。实际上,我不确定I need to filter only alpha numeric characters along with it. 在他的评论中的 OP 是什么意思,因为他的示例输入中没有非字母数字字符,所以我不确定你需要什么,但不管它是什么,它是不是你所拥有的......
  • @EdMorton ^ 表示一行的开头而不是单词的开头,-w 表示 grep 将仅匹配整个单词。我假设他想根据提问者已经拥有的内容以及-o 选项匹配行首的第一个完整单词,这正是返回的内容。除非你能看到我看不到的东西,并且假设我的假设是正确的,否则我认为我的答案几乎已经涵盖了。
  • 我明白这一切,但如果 OPs 输入数据如图所示,每行一个单词,那么你不需要匹配整个单词和一行的开头,因为每一行都是一个整体单词。出于同样的原因,您也不需要-o。您的答案将产生预期的输出,它只是做一些不必要的事情,但由于 OP 没有向我们显示包含非字母数字字符的输入,我们不知道您使用的构造子集是多余的。
【解决方案2】:

Awk 与其POSIX 兼容的length() 函数一起使用,

awk '(length($0)==6 || length($0)==8) && $0 ~ /[[:alnum:]]{6}|[[:alnum:]]{8}/' file
DSWEDFBG
WTSETO

适用于输入文件

TESTING
TSET24D
DSWEDFBG
WTSETO
MSDWEHLKGY
------
--------
------a
@1234$21

(或)

就像 Ed Morton 建议的那样,做起来更简单

awk '/^([[:alnum:]]{6}|[[:alnum:]]{8})$/' file

【讨论】:

  • 试试这个 - awk '/[[:alnum:]]/ && (length($0)==6 || length($0)==8)' ff
  • @VIPINKUMAR 这将返回长度为 6 或 8 的任何内容,其中包含一个 [[:alnum:]],例如 -------a
  • @Inian 好像少了一个单引号
  • @Inian 它不适合我,[root@server ~]# awk '(length($0)==6 || length($0)==8) && $0 ~ /[[:alnum:]]{6}|[[:alnum:]]{8}/' listfile [root@server ~]#
  • @Karthi1234:发布文件的内容,它不工作
【解决方案3】:

在 awk 中:

awk '/^......(..)?$/' file
DSWEDFBG
WTSETO

[[:alnum:]]s 也一样:

$ awk '/^[[:alnum:]]{6}([[:alnum:]]{2})?$/' file
DSWEDFBG
WTSETO

【讨论】:

  • 您的第一个解决方案不匹配整个单词,只匹配任何 6 或 8 个字符长的字符串。将包括符号、空格或其他任何内容。
  • @KindStranger 你是对的,但 OP 说:字符串长度只有 6 和 8 个字符只过滤字母数字字符的要求后来出现了作为答案中的评论。因此,两个答案可以满足两个要求。哦,您实际上对此表示反对?哇哦。
猜你喜欢
  • 2022-01-08
  • 2018-05-18
  • 1970-01-01
  • 2023-03-09
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-03
相关资源
最近更新 更多