在Unix/Bash中回显文本文件的最后一个字符

在Unix/Bash中回显文本文件的最后一个字符,bash,unix,Bash,Unix,我需要查看一堆文本文件的最后几个字符(或者测试它们是否为“}”,并给出一个测试为负数的文件列表)。有没有一种简单的方法可以从命令行执行此操作 (理想情况下,解决方案不需要从一开始就读取整个文件,因为除了有许多文件外,它们还可能相当大 注:任何答案都很好,但如果能充分解释答案中所有内容的功能和语法,我将不胜感激。使用tail可以相当轻松地完成,然后在bash中进行字符串索引。例如,使用tail-n1 file获取文件中的最后一行。您需要存储该行在使用命令替换的变量中,例如 然后,它只是一个索引最后

我需要查看一堆文本文件的最后几个字符(或者测试它们是否为“}”,并给出一个测试为负数的文件列表)。有没有一种简单的方法可以从命令行执行此操作

(理想情况下,解决方案不需要从一开始就读取整个文件,因为除了有许多文件外,它们还可能相当大


注:任何答案都很好,但如果能充分解释答案中所有内容的功能和语法,我将不胜感激。

使用
tail
可以相当轻松地完成,然后在bash中进行字符串索引。例如,使用
tail-n1 file
获取文件中的最后一行。您需要存储该行在使用命令替换的变量中,例如

然后,它只是一个索引最后字符的问题,例如

echo ${lastln:(-1)}
注意:在从字符串末尾开始索引时,必须将偏移量(例如
-1
放在括号
(-1)
——或者——必须在
-1
之前留出一个,例如
echo${lastln:-1}
也是有效的。)

您可以尝试以下方法:

for file in file1 file2; do tail -n 1 "$file" | grep -q '}$' || echo "$file"; done
您应该在其中使用要分析的文件列表替换
file1 file2
,例如
*
或类似文件。现在发生了什么?外部部分

for file in file1 file2; do ...; done
是一个简单的文件循环,在循环中,您可以将当前文件引用为$file。然后

tail -n 1 "$file"
打印给定文件的最后一行,然后

| grep -q '}$'
将输出重定向到grep(使用
-q
转换为静默模式),该模式立即查找“}”,后跟行尾($)。此命令的返回值可用于链接另一个操作:当grep返回非零(表示失败,即模式不匹配)时,最后一部分

|| echo "$file"

执行,生成所需文件的列表。

您可以使用
tail
命令获取最后一行,并检查该行是否以
}
结尾。哇,谢谢!感谢您耐心地解释这些步骤。p.S.我实际上要求返回一个测试为阴性的列表,也就是说,我的意思是不匹配},以便更改该列表我会用| |代替&&对吗?
|| echo "$file"