我正在尝试获取以单词“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