shell 在Bash中从最后到第一个输出文件行

wswtfjt7  于 2023-10-23  发布在  Shell
关注(0)|答案(6)|浏览(161)

我想显示日志文件的最后10行,* 从最后一行开始 *-就像普通的日志阅读器一样。我以为这是tail命令的变体,但我在任何地方都找不到它。

eivgtgni

eivgtgni1#

**GNU(Linux)**使用以下内容:

tail -n 10 <logfile> | tac

tail -n 10 <logfile>打印出日志文件的最后10行,而tac(猫的拼写是倒过来的)则颠倒顺序。
tail的**BSD(OS X)**使用-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中编写功能。

erhoui1w

erhoui1w2#

tac做你想做的。它是cat的反方向。
tail -10 logfile | tac

dojqjjoe

dojqjjoe3#

我最终使用了tail -r,它在我的OSX上工作(tac不工作)

tail -r -n10
dphi5xsq

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

daolsyd0

daolsyd05#

这是一个完美的方法来打印输出在相反的顺序

tail -n 10 <logfile>  | tac
chy5wohz

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

相关问题