【问题标题】:grep pattern match with line numbergrep 模式与行号匹配
【发布时间】:2019-04-30 12:48:45
【问题描述】:

我想获取匹配模式的行号,但我有一个条件是模式匹配应该有 'digits' 。 如果我使用
grep -ri -n "包 $i" 。 | grep -P '\d'
然后我会得到匹配模式的行的行号,但我也会得到没有任何数字的'package'行:

下面的输出显示了“package ca-certificates”的第 71 行,但还有 4 行我不需要的 gluterfs。我不需要这些行,因为它们没有任何数字。

for i in $(awk '{print $1}' ~/Version-pkgs)
do
grep -ri -n   "package $i " . | grep -P '\d'
done

sh search-version-pkgs.sh
./core.pkglist:71:package ca-certificates         2017.2.14   65.0.1.el6_9               arch noarch
./dev.pkglist:1343:package glusterfs-devel \
./dev.pkglist:1346:package glusterfs-api-devel \
./dev.pkglist:1346:package glusterfs-api-devel \
./dev.pkglist:1346:package glusterfs-api-devel \
./dev.pkglist:1343:package glusterfs-devel \
./core.pkglist:234:package initscripts             9.03.58     1.0.3.el6_9.2prerel7.6.0.0.0_88.51.0            arch ${bestArch}
./core.pkglist:397:package nspr                    4.13.1      1.el6
./dev.pkglist:859:package nspr-devel \
./dev.pkglist:859:package nspr-devel \
./core.pkglist:401:package nss                     3.28.4      4.0.1.el6_9       arch ${bestArch}

在脚本下面运行给了我精确的模式匹配,即“包”,但我不会得到它们的行号

for i in $(awk '{print $1}' ~/Version-pkgs)
do
egrep -ri    "package $i " . | grep -P '\d'
done

sh search-version-pkgs.sh
./core.pkglist:package ca-certificates         2017.2.14   65.0.1.el6_9               arch noarch
./core.pkglist:package initscripts             9.03.58     1.0.3.el6_9.2prerel7.6.0.0.0_88.51.0            arch ${bestArch}
./core.pkglist:package nspr                    4.13.1      1.el6
./core.pkglist:package nss                     3.28.4      4.0.1.el6_9       arch ${bestArch}
./core.pkglist:package nss-util                3.28.4      1.el6_9          arch ${bestArch}
./core.pkglist:package tzdata                  2018e       3.el6    arch noarch

如何获得行号以及模式匹配为 file:lineno.:package pkgname digits 的输出

【问题讨论】:

  • 不清楚,能否请您提供有关输入和预期输出的更多详细信息,然后告诉我们。
  • 输出不应包含没有数字的行。
  • 您问题中的哪个文本块是示例输入,哪个是预期输出?

标签: awk sed grep


【解决方案1】:
for i in $(cut -f1 ~/Version-pkgs)
do
    grep -rin   "package $i.*[0-9]" .
done

不需要两次使用grep

单线:

grep -rinf <(sed -E 's,([^ ]*).*,package \1.*[0-9],' ~/Version-pkgs) .

【讨论】:

  • 感谢 Corentin Limier,它有效并显示了预期的结果。
猜你喜欢
  • 2013-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多