【问题标题】:Using Bash Script to Find Line Number of String in File使用 Bash 脚本查找文件中字符串的行号
【发布时间】:2013-11-30 08:08:15
【问题描述】:

如何使用 bash 脚本查找字符串所在的行号?

例如,如果一个文件看起来像这样,

Hello I am Isaiah
This is a line of text.
This is another line of text.

我运行脚本来查找字符串“line”,它会输出数字 2,因为它是第一次出现。

【问题讨论】:

  • 你可以做 grep -n "line" file.txt 它会给你行号。
  • 另外 grep --color=always -n "line" file.txt 将用红色突出显示单词“line”的出现

标签: linux bash shell unix terminal


【解决方案1】:

为了完全匹配,我使用

grep -wn <your exact match word> inputfile | cut -d: -f1

解释: -n 打印行号 -w 只返回完全匹配的行

【讨论】:

    【解决方案2】:

    我喜欢悉达多对 OP 的评论。为什么他没有发布它作为答案让我无法理解。

    我通常只想要第一行的行号来显示我正在寻找的内容。

    lineNum="$(grep -n "needle" haystack.txt | head -n 1 | cut -d: -f1)"
    

    说明: 在 grep 之后,只抓取第一行 (num:line),cut 被冒号 delimiter 并抓住第一个 field

    【讨论】:

    • head -n 1 可以替换为grep 中的-m 1 标志
    【解决方案3】:

    鉴于您的示例仅打印字符串第一次出现的行号,也许您正在寻找:

    awk '/line/{ print NR; exit }' input-file
    

    如果您确实想要所有的出现(例如,如果您的示例的所需输出实际上是“2\n3\n”),请省略 exit

    【讨论】:

    • 我试过使用上面的命令,字符串'line'存储在一个变量中。我在某处读到,当我们尝试在 awk 命令中使用外部变量时,最好先将外部变量分配给本地 awk 变量。因此,我尝试了以下命令: awk -v var="$external_variable" '/external_variable/{ print NR; exit }' 输入文件,但该命令未返回行号。你能告诉我我做错了什么吗?
    • 您需要使用match 而不是//。例如:awk 'match($0,v){print NR; exit}' v=$external_variable input-file 应该可以工作。
    猜你喜欢
    • 2013-03-02
    • 2019-11-03
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    • 2011-10-11
    • 2014-02-17
    相关资源
    最近更新 更多