【问题标题】:How to print the line number where a string appears in a file?如何打印文件中出现字符串的行号?
【发布时间】:2015-08-19 22:36:33
【问题描述】:

我有一个特定的单词,我想找出我的文件中出现该单词的行号。

这发生在一个 c shell 脚本中。

我一直在尝试使用 awk 来查找行号,但到目前为止我还没有找到。我也想将该行号分配给一个变量。

【问题讨论】:

  • 不要写 c shell 脚本。谷歌CSH why not.

标签: shell awk


【解决方案1】:

使用 grep

要在文件中查找word 并打印行号,请使用-n 选项到grep

grep -n 'word' file

这将打印行号和匹配的行。

使用 awk

这将打印文件中出现word这个词的行号:

awk '/word/{print NR}' file

这将打印行号和出现word 的行:

awk '/word/{print NR, $0}' file

您可以将word 替换为您喜欢的任何正则表达式。

它是如何工作的:

  • /word/

    这将选择包含word 的行。

  • {print NR}

    对于选定的行,这将打印行号(NR 表示记录编号)。您可以更改它以打印您感兴趣的任何信息。因此,{print NR, $0} 将打印行号,然后是行本身,$0

将行号分配给变量

使用命令替换:

n=$(awk '/word/{print NR}' file)

使用 shell 变量作为模式

假设我们要查找的正则表达式在shell变量url中:

awk -v x="$url" '$0~x {print NR}' file

还有:

n=$(awk -v x="$url" '$0~x {print NR}' file)

【讨论】:

  • 我试图匹配的表达式保存在一个变量中,所以我用 $url 代替 word。这会导致错误吗?
  • @Taylor 是的,你必须小心如何做到这一点。最好的方法是使用-v 选项将shell 变量url 分配给一个awk 变量,然后使用awk 变量进行正则表达式匹配。请参阅答案末尾的新部分。
  • 可以用另一个文件的内容代替word吗?
  • @AruniRC 是的。例如,grep -nf file1 file2 将打印 file2 中与 file1 中的任何一行匹配的每一行(连同其行号)。 file1 中的行被视为正则表达式,如果您不希望这样,请使用 grep -nFf file1 file2 来查找文字(非正则表达式)匹配。
【解决方案2】:

Sed

你可以使用 sed 命令

 sed -n '/pattern/=' file

说明

-n 抑制正常输出,因此它不会打印实际行。它首先匹配/pattern/,然后= 运算符表示打印行号。请注意,这将打印包含该模式的所有行。

【讨论】:

  • 为了跟进这一点,作为我的模式,我想使用一个名为“url”的变量,所以当我输入这个命令时,我会执行 sed $url= file.txt,但它不起作用,因为我假设的美元。有什么办法吗?
  • 要使用shell变量,请使用双引号sed -n "/$url/=" file.txt
  • 我收到以下错误消息:sed: -e expression #1, char 2: extra characters after command
  • $url 的值是多少?如果它包含任何特殊字符,如/ 斜杠,那么我们需要更改 sed 命令的分隔符。
  • 我假设值 $url 没有逗号。试试sed -n "\,$url,=" file.txt
【解决方案3】:

使用 NR 变量

给定一个包含以下内容的文件:

foo
bar
baz

使用内置的NR variable 查找行号。例如:

$ awk '/bar/ { print NR }' /tmp/foo
2

【讨论】:

    【解决方案4】:

    找到第一列匹配 RRBS 的行号

    awk 'i++ {if($1~/RRBS/) print i}' ../../bak/bak.db
    

    【讨论】:

      猜你喜欢
      • 2018-09-27
      • 2012-12-06
      • 1970-01-01
      • 2023-01-09
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 2018-11-20
      相关资源
      最近更新 更多