当我运行像我这样的命令时tail ~/SOMEFILE
,例如:
testenv@vps_1:~# tail ~/SOMEFILE
This is the content of SOMEFILE.
但是,如果我想在:testenv@vps_1:~#
和输出之间有一个回车符怎么办:This is the content of SOMEFILE.
所以最终的结果会是这样的:
testenv@vps_1:~# tail ~/SOMEFILE
This is the content of SOMEFILE.
或这个:
testenv@vps_1:~# tail ~/SOMEFILE
This is the content of SOMEFILE.
或这个:
testenv@vps_1:~# tail ~/SOMEFILE
This is the content of SOMEFILE.
注意:第一个示例显示两个部分之间的一行间距,第二个示例显示两行,第三个示例显示三行。
有没有办法确保
tail
输出(或任何其他输出)像我在示例中所示的那样被间隔开,只是为了这个特定的命令(当然不是所有命令),在 Bash 中?
答案1
tail
没有任何论据来管理这个。
作为一个人你可以做什么解决方法正在打印一个空行在运行 tail 命令之前。
echo && tail ~/SOMEFILE
对于多条线路:
yes
也可以使用命令。是的手册页就像这里建议的那样:bash:打印 x 空行数
yes '' | sed 5q && tail ~/SOMEFILE
将 5 替换为您想要的空行数。
注意:您可能还想看看编辑终端提示符。但随后它将是终端范围的,而不仅仅是链接到您的特定命令。
答案2
最简单的选择是手动打印那些额外的换行符,例如:
printf '\n\n\n'; tail ~/SOMEFILE
但如果你想:
- 这样做只是为了
tail
- 每次
tail
调用时不要编写额外的命令 - 对换行符的数量进行简单而全面的控制
那么我建议您将一个函数添加到您的 aliases/rc 文件中。
例如:
# Bash version
# In Bash we can override commands with functions
# thanks to the `command` builtin
tail() {
# `local` limit the scope of variables,
# so we don't accidentally override global variables (if any).
local i lines
# `lines` gets the value of the first positional parameter.
lines="$1"
# A C-like iterator to print newlines.
for ((i=1; i<=lines; i++)); do
printf '\n'
done
# - `command` is a bash builtin, we can use it to run a command.
# whose name is the same as our function, so we don't trigger
# a fork bomb: <https://en.wikipedia.org/wiki/Fork_bomb>
#
# - "${@:2}" is to get the rest of the positional parameters.
# If you want, you can rewrite this as:
#
# # `shift` literally shifts the positional parameters
# shift
# command "${@}"
#
# to avoid using "${@:2}"
command tail "${@:2}"
}
#===============================================================================
# POSIX version
# POSIX standard does not demand the `command` builtin,
# so we cannot override `tail`.
new_tail() {
# `lines` gets the value of the first positional parameter.
lines="$1"
# `i=1`, `[ "$i" -le "$lines" ]` and `i=$((i + 1))` are the POSIX-compliant
# equivalents to our C-like iterator in Bash
i=1
while [ "$i" -le "$lines" ]; do
printf '\n'
i=$((i + 1))
done
# Basically the same as Bash version
shift
tail "${@}"
}
所以你可以将其称为:
tail 3 ~/SOMEFILE
答案3
对于单个空行
sed '{x;1p;x;}' filename | tail
开头5个空行
sed '{x;1p;1p;1p;1p;1p;x;}' filename | tail