我想显示日志文件的最后10行,* 从最后一行开始 *-就像普通的日志阅读器一样。我以为这是tail命令的变体,但我在任何地方都找不到它。
eivgtgni1#
**GNU(Linux)**使用以下内容:
tail -n 10 <logfile> | tac
tail -n 10 <logfile>打印出日志文件的最后10行,而tac(猫的拼写是倒过来的)则颠倒顺序。tail的**BSD(OS X)**使用-r选项:
tail -n 10 <logfile>
tac
tail
-r
tail -r -n 10 <logfile>
对于这两种情况,您可以尝试以下操作:
if hash tac 2>/dev/null; then tail -n 10 <logfile> | tac; else tail -n 10 -r <logfile>; fi
**注意:**GNU手册指出BSD -r选项“只能反转最多与其缓冲区一样大的文件,通常为32 KiB”,并且tac更可靠。如果缓冲区大小是一个问题,并且您不能使用tac,您可能需要考虑使用@ata的答案,该答案在bash中编写功能。
erhoui1w2#
tac做你想做的。它是cat的反方向。tail -10 logfile | tac
cat
tail -10 logfile | tac
dojqjjoe3#
我最终使用了tail -r,它在我的OSX上工作(tac不工作)
tail -r
tail -r -n10
dphi5xsq4#
你可以用pure bash来实现:
#!/bin/bash readarray file lines=$(( ${#file[@]} - 1 )) for (( line=$lines, i=${1:-$lines}; (( line >= 0 && i > 0 )); line--, i-- )); do echo -ne "${file[$line]}" done
./tailtac 10 < somefile./tailtac-10 < somefile./tailtac 100000 < somefile./tailtac < somefile
daolsyd05#
这是一个完美的方法来打印输出在相反的顺序
chy5wohz6#
纯bash解决方案是
_tac_echo() { IFS=$'\n' echo "${BASH_ARGV[*]}" } _tac () { local -a lines readarray -t lines shopt -s extdebug _tac_echo "${lines[@]}" shopt -u extdebug } cat <<'EOF' | _tac 1 one line[of] smth 2 two line{of} smth 3 three line(of) smth 4 four line&of smth EOF
哪个打印
4 four line&of smth 3 three line(of) smth 2 two line{of} smth 1 one line[of] smth
6条答案
按热度按时间eivgtgni1#
**GNU(Linux)**使用以下内容:
tail -n 10 <logfile>
打印出日志文件的最后10行,而tac
(猫的拼写是倒过来的)则颠倒顺序。tail
的**BSD(OS X)**使用-r
选项:对于这两种情况,您可以尝试以下操作:
**注意:**GNU手册指出BSD
-r
选项“只能反转最多与其缓冲区一样大的文件,通常为32 KiB”,并且tac
更可靠。如果缓冲区大小是一个问题,并且您不能使用tac
,您可能需要考虑使用@ata的答案,该答案在bash中编写功能。erhoui1w2#
tac
做你想做的。它是cat
的反方向。tail -10 logfile | tac
dojqjjoe3#
我最终使用了
tail -r
,它在我的OSX上工作(tac
不工作)dphi5xsq4#
你可以用pure bash来实现:
./tailtac 10 < somefile
./tailtac-10 < somefile
./tailtac 100000 < somefile
./tailtac < somefile
daolsyd05#
这是一个完美的方法来打印输出在相反的顺序
chy5wohz6#
纯bash解决方案是
哪个打印