说我有一个巨大的文本文件(> 2GB),我只是想cat行X至Y(如57890000至57890010)。
据我所知,我可以通过管道head输入tail或反之亦然来做到这一点,即
head -A /path/to/file | tail -B
Run Code Online (Sandbox Code Playgroud)
或者
tail -C /path/to/file | head -D
Run Code Online (Sandbox Code Playgroud)
其中A、B、C和D可以根据文件中的行数计算得出,X和Y。
但是这种方法有两个问题:
A,B,C和D。pipe相互发送比我感兴趣的多得多的行(例如,如果我只读取大文件中间的几行)有没有办法让 shell 只使用并输出我想要的行?(同时仅提供X和Y)?
有没有办法head/tail一个文件并获得反向输出;因为您不知道文档中有多少行?
即我只想获取除前两行之外的所有内容foo.txt以附加到另一个文档。
我有 200 行的文件。
我需要从 10 到 100 中提取行并将它们放入一个新文件中。
你如何在 unix/Linux 中做到这一点?
您可以使用哪些可能的命令?
我有一个包含多行的文件,每一行的开头都有一个时间戳,例如
[Thread-3] (21/09/12 06:17:38:672) logged message from code.....
Run Code Online (Sandbox Code Playgroud)
所以,我经常从这个日志文件中检查两件事。
是否有任何快速方便的单个命令可以让我只显示文件的前几行和最后几行?
find命令可以将文件名输出为空分隔的字符串(如果-print0提供),并且xargs可以在-0打开选项的情况下使用它们。但是在两者之间,很难对文件进行操作的该集合-sort命令有-z开关,这使得它可能对这些文件进行排序,但head并tail没有他们。
我该怎么做head,并tail在一个方便的方式与空分隔的投入?(我总是可以创建一个简短而缓慢的 ruby 脚本,但我希望可以有更好的方法)
由于种种原因,我雄心勃勃地尝试将 c++ 代码转换为 bash。
此代码读取和操作特定于我的子字段的文件类型,该文件类型完全以二进制形式编写和构建。我的第一个与二进制相关的任务是完全按原样复制头的前 988 个字节,并将它们放入一个输出文件中,我可以在生成其余信息时继续写入该文件。
我很确定我当前的解决方案不起作用,实际上我还没有找到确定这一点的好方法。因此,即使它实际上编写正确,我也需要知道如何测试以确保!
这就是我现在正在做的:
hdr_988=`head -c 988 ${inputFile}`
echo -n "${hdr_988}" > ${output_hdr}
headInput=`head -c 988 ${inputTrack} | hexdump`
headOutput=`head -c 988 ${output_hdr} | hexdump`
if [ "${headInput}" != "${headOutput}" ]; then echo "output header was not written properly. exiting. please troubleshoot."; exit 1; fi
Run Code Online (Sandbox Code Playgroud)
如果我使用 hexdump/xxd 来检查文件的这一部分,虽然我不能完全阅读其中的大部分内容,但似乎有些不对劲。我为比较而编写的代码只告诉我两个字符串是否相同,而不是按照我希望的方式复制它们。
有没有更好的方法在 bash 中做到这一点?我可以简单地复制/读取本机二进制中的二进制字节,逐字复制到文件吗?(理想情况下也存储为变量)。
这个问题的变体肯定在不同的地方被问过几次,但我试图M从文件中删除最后一行而没有运气。
在第二个最投票的答案在这个问题建议做以下摆脱在文件的最后一行:
head -n -1 foo.txt > temp.txt
Run Code Online (Sandbox Code Playgroud)
但是,当我在 OSX & Zsh 中尝试时,我得到:
head: illegal line count -- -1
Run Code Online (Sandbox Code Playgroud)
这是为什么?我如何删除M 最后一个行和在第一个 N给定文件的行?
预计以下 shell 命令仅打印输入流的奇数行:
echo -e "aaa\nbbb\nccc\nddd\n" | (while true; do head -n 1; head -n 1 >/dev/null; done)
Run Code Online (Sandbox Code Playgroud)
但它只是打印第一行:aaa。
与-c( --bytes) 选项一起使用时不会发生同样的情况:
echo 12345678901234567890 | (while true; do head -c 5; head -c 5 >/dev/null; done)
Run Code Online (Sandbox Code Playgroud)
此命令1234512345按预期输出。但这仅适用于该实用程序的coreutils实现head。该busybox的执行还是吃多余的字符,所以输出正好12345。
我想这种特定的实现方式是为了优化目的。您无法知道该行在哪里结束,因此您不知道需要阅读多少个字符。不消耗输入流中额外字符的唯一方法是逐字节读取流。但是一次从流中读取一个字节可能会很慢。所以我想head将输入流读取到一个足够大的缓冲区,然后计算该缓冲区中的行数。
对于--bytes使用选项的情况,情况并非如此。在这种情况下,您知道需要读取多少字节。所以你可以准确地读取这个字节数,而不是更多。该corelibs实现使用这个机会,但是busybox的一个没有,它仍然比读取所需到缓冲区的字节以上。这样做可能是为了简化实现。
所以问题。该head实用程序从输入流中消耗比要求的更多字符是否正确?Unix 实用程序是否有某种标准?如果有,它是否指定了这种行为?
聚苯乙烯
您必须按Ctrl+C以停止上述命令。Unix 实用程序不会在读取超出EOF. 如果不想按,可以使用更复杂的命令:
echo 12345678901234567890 | (while true; …Run Code Online (Sandbox Code Playgroud) 我需要一个实用程序来打印前 n 行,然后继续运行,吸收其余的行,但不打印它们。我用它来不让终端被需要继续运行的进程的输出淹没(它将结果写入文件)。
我想我可以做到process | {head -n 100; cat > /dev/null},但有没有更优雅的东西?
给定以下 3 个脚本:
printf 'a\nb\nc\n' > file && { head -n 1; cat; } < fileprintf 'a\nb\nc\n' | { head -n 1; cat; }{ head -n 1; cat; } < <(printf 'a\nb\nc\n')我期望每个的输出是:
a
b
c
Run Code Online (Sandbox Code Playgroud)
但对于其中一些系统,在某些系统上,情况并非如此。例如,在 cygwin 上:
$ printf 'a\nb\nc\n' > file && { head -n 1; cat; } < file
a
b
c
Run Code Online (Sandbox Code Playgroud)
$ printf 'a\nb\nc\n' | { head -n 1; cat; }
a
Run Code Online (Sandbox Code Playgroud)
$ { head -n 1; cat; } < <(printf 'a\nb\nc\n')
a …Run Code Online (Sandbox Code Playgroud)