我经常在网上看到用不同符号连接各种命令的教程。例如:
command1 | command2
command1 & command2
command1 || command2
command1 && command2
Run Code Online (Sandbox Code Playgroud)
其他人似乎将命令连接到文件:
command1 > file1
command1 >> file1
Run Code Online (Sandbox Code Playgroud)
这些是什么?他们叫什么?他们在做什么?还有更多吗?
我最近意识到我们可以使用cat尽可能多的dd,而且它实际上比dd
我知道这dd在处理块大小实际上影响正确性而不仅仅是性能的磁带时很有用。然而,在这些日子里,是否存在dd可以做一些cat不能做的事情?(在这里,我认为不到 20% 的性能差异无关紧要。)
具体的例子会很好!
我有一个 bash 脚本,它枚举目录中的每个 *.php 文件并应用于iconv它。这将在 STDOUT 中获得输出。
由于添加-o参数(根据我的经验)实际上可能在转换发生之前写入一个空白文件,我如何调整我的脚本以进行转换,然后覆盖输入文件?
for file in *.php
do
iconv -f cp1251 -t utf8 "$file"
done
Run Code Online (Sandbox Code Playgroud) 有没有办法head/tail一个文件并获得反向输出;因为您不知道文档中有多少行?
即我只想获取除前两行之外的所有内容foo.txt以附加到另一个文档。
我有一个极端的问题,我能想到的所有解决方案都很复杂。根据我的 UNIX/Linux 经验,一定有一个简单的方法。
我想删除/foo/. 每个文件都足够长。好吧,我相信有人会为我提供一个我无法想象的非常简单的解决方案。也许awk?
我想从文件中删除一些特定的行。假设它是第 20-37 行,然后是第 45 行。如果不指定这些行的内容,我该怎么做?
该man页面并没有给我太大希望,但我希望它是一个未记录的(和/或特定于 GNU 的)功能。
由于尚未诊断的应用程序错误,我有数百个磁盘已满的服务器。有一个文件被重复的行填满——不是日志文件,而是一个带有变量定义的用户环境文件(所以我不能直接删除该文件)。
我编写了一个简单的sed命令来检查错误添加的行并删除它们,并在文件的本地副本上对其进行了测试。它按预期工作。
但是,当我在带有完整磁盘的服务器上尝试它时,我得到了大约以下错误(它来自内存,而不是复制和粘贴):
sed: couldn't flush /path/to/file/sed8923ABC: No space left on deviceServerHostname
Run Code Online (Sandbox Code Playgroud)
当然,我知道没有剩余空间了。这就是为什么我试图删除东西!(sed我使用的命令会将 4000 多行的文件减少到大约 90 行。)
我的sed命令只是sed -i '/myregex/d' /path/to/file/filename
尽管磁盘已满,有没有办法可以应用此命令?
(它必须是自动化的,因为我需要将它应用到数百台服务器上作为快速修复。)
(显然需要诊断应用程序错误,但同时服务器无法正常工作......)
更新:通过删除我发现可以删除的其他内容来解决我面临的情况,但我仍然希望得到这个问题的答案,这对未来和其他人都有帮助。
/tmp是不行的;它在同一个文件系统上。
在释放磁盘空间之前,我进行了测试,发现可以vi通过打开文件并运行来删除其中的行:g/myregex/d,然后使用:wq. 似乎应该可以自动执行此操作,而无需求助于单独的文件系统来保存临时文件......(?)
巧合的是,我不得不使用我的 ATA-ID-to-device-name 脚本(在这里找到:https : //serverfault.com/questions/244944/linux-ata-errors-translating-to-a-device-name/ 426561#426561 ) 在只读 /分区上。如果你好奇,它是一个 Ubuntu 恢复控制台,它可以让你访问你的/分区,但默认情况下它会以只读方式挂载。我对此很高兴,因为否则我可能永远不会发现我的脚本由于特定行而在 R/O 系统上表现得很奇怪,这个:
IFS=: read HostMain HostMid HostSub <<< "$HostFull"
Run Code Online (Sandbox Code Playgroud)
这并不会在没有写权限的工作。不过,我不会认为它会失败。但显然<<<操作员确实需要将一些临时文件写入某个地方。
但是有没有办法绕过临时文件的创建,或者,有没有办法指定文件的写入位置?在 Ubuntu 恢复控制台中,有——奇怪的是——对/run目录的写权限,如果我能以某种方式“告诉”read将临时文件写入其他地方而不是平常,那就可以了。
一个相关的问题是here。
我经常需要通过从中间删除几行来编辑大文件。我知道我想删除哪些行,我通常会执行以下操作:
sed "linenum1,linenum2 d" input.txt > input.temp
Run Code Online (Sandbox Code Playgroud)
或通过添加 -i 选项内联。由于我知道行号,是否有避免流编辑并删除特定行的命令?input.txt 可以大到 50 GB。
我已经读过:有没有办法就地修改文件?
我很好奇是否有办法使用不会创建临时文件的命令来修改文件。假设我创建了一个目录
mkdir read_only
,然后在 read_only 中创建了一些文件。当我愉快地完成创建文件时,我运行chmod 555 read_only. 现在是否可以在不使用临时文件的情况下修改任何文件?具体来说,我想要一个可以从 bash 脚本完成的解决方案。我不想知道是否有可能;我也在寻求解决方案。到目前为止,我使用 bash/unix 命令管理的所有想法都会创建临时文件。
编辑:我相信我的问题不是Can a file be edit with 'write' permission on it 但不是在其父目录上的重复?出于以下原因:
我有有许多大的二进制文件(近二进制文件!) \ r \ n
在它[被产生的窗口env和没有CONTROLE在生成的应用程序]。我想从这个大文件 [ =~ 1Gb ] 中删除\r以在另一个对\r's 大喊大叫的旧应用程序中进行进一步处理
有没有什么简单的方法可以用unix方式做到这一点?