来自特定起始词的尾部

来自特定起始词的尾部

我正在尝试获取以单词“cold”开头的文本文件的最后几行。我不知道该单词第一次出现在哪一行,但我希望打印它以及它之后的每一行。我试过使用,tr但似乎找不到需要知道行的方法。

答案1

尝试以下操作(在 bash 中)

wordtail(){
    linenumber=$(grep -n "$1" "$2" | sed 's/:.*//' | tail -1)
    tail +$linenumber "$2"
}

wordtail cold your_file

您创建一个执行所需操作的函数,因为命令本身不支持它。

答案2

如果你想找到最后的如果只读取一个单词的出现次数,而不是第一个单词,那么 Ljm Dullaart 的答案每次都会读取整个文件。这里有一个替代方案,它会从文件末尾读取,直到找到该关键字的第一个实例。对于大文件来说,这要快得多。

wordtail(){
    linenumber=$(tac "$2" | grep -n "$1" -m 1 | sed 's/:.*//')
    tail -$linenumber "$2"
}

wordtail cold your_file

答案3

我不知道这个单词第一次出现在哪一行,但我希望打印它和它之后的每一行。

看来你想得到文件的最后一部分来自模式的第一次出现到结束. 在这种情况下,请改用 awk

awk '/cold/ { f = 1 } f' yourfile.txt

这将在第一次匹配时将标志设置为 true,即第一行包含cold。如果你想找到第一行以 开头的行,cold那么将模式更改为

awk '/^cold/ { f = 1 } f' yourfile.txt

这不需要多次读取文件,因此甚至可以在管道中工作,与其他答案不同

some 'command' "with" args | awk '/cold/ { f = 1 } f'
some 'command' "with" args | awk '/^cold/ { f = 1 } f'

请注意,它将进行区分大小写的匹配。要进行不区分大小写的匹配,请使用以下任一方法

awk '/cold/i { f = 1 } f' yourfile.txt
awk -v 'IGNORECASE=1' '/cold/ { f = 1 } f' yourfile.txt
awk 'BEGIN{IGNORECASE = 1} /cold/ { f = 1 } f' yourfile.txt

相关内容