FreeBSD 11.2 p7 附带的 sed 提供:
$ seq 10 | sed 'N; l; D; p'
1$
2$
2$
3$
3$
4$
4$
5$
5$
6$
6$
7$
7$
8$
8$
9$
9$
10$
Run Code Online (Sandbox Code Playgroud)
虽然 gsed (GNU sed 4.7) 给出了相同的脚本:
$ seq 10 | gsed 'N; l; D; p'
1\n2$
2\n3$
3\n4$
4\n5$
5\n6$
6\n7$
7\n8$
8\n9$
9\n10$
10
Run Code Online (Sandbox Code Playgroud)
我们如何解释这种行为差异?
这是我的工作代码,但我相信它没有优化 - 必须有一种方法可以比这更快地完成工作:
find . -type f -iname '*.py' -printf '%h\0' |
sort -z -u |
xargs -r -0 -I{} sh -c '
find "{}" -maxdepth 1 -type f -iname "*.py" -print0 |
xargs -r -0 du -sch |
tail -1 |
cut -f1 |
tr "\n" " "
echo -e "{}"' |
sort -k1 -hr |
head -50
Run Code Online (Sandbox Code Playgroud)
目标是递归搜索所有包含目录的目录,*.py然后*.py按每个目录的名称打印所有文件的总大小,按大小按相反顺序对它们进行排序并仅显示前 50 个。
任何想法如何改进此代码(性能方面)但保持相同的输出?
我在以下示例中测试了您的建议:47GB total: 5805 files
不幸的是,我无法逐一比较,因为并非所有建议都遵循相同的准则:总大小应该是磁盘使用量,分隔符应该只是一个空格。格式应如下所示:numfmt --to=iec-i --suffix=B
以下 4 个是排序输出,但 …
我有可以重新启动其内部状态的长时间运行的程序。我只想查看最新状态的日志文件条目(加载到vim's quickfix)。如何在最后一次出现字符串后显示所有行STARTING SESSION?
我目前的解决方案(日志文件有时有千兆字节长,所以我从不查看超过最后 5000 行的内容):
tail -n5000 logfile.log | grep -B5000 -v -e 'STARTING SESSION'> shortened.log
Run Code Online (Sandbox Code Playgroud)
当会话产生大量日志时,这很有效,但如果我有更短的日志并多次重启,则它包含多个会话。
本质上,我想要一个类似于--reverse标志的东西,它可以从文件的末尾而不是开头进行 grep 搜索:
grep --reverse --after-context=5000 --max-count=1 'STARTING SESSION' logfile.log
Run Code Online (Sandbox Code Playgroud)
笔记:
问题类似于在第 n 次出现匹配后打印行,但我想要最后一次出现。
该问题与在 POSIX.2 中从最后一个标记获取文本到 EOF几乎相同,只是我没有 POSIX 要求并且我的文件很大。我更喜欢使用 GNU utils 的高效解决方案(我正在使用mingw64)。
我有一些带有 grep 版本 2.16 的 SLES 12 SP5 机器,并且在一台机器上我大量使用包含以下grep --quiet条件的脚本:
# $pid_list contains the result of pstree and $script_pid equals $$
if echo "$pid_list" | grep -qF "($script_pid)"; then
continue
fi
if echo "$pid_list" | grep -qF "($script_pid)"; then
echo "Error: grep has a bug!"
continue
fi
Run Code Online (Sandbox Code Playgroud)
我将其加倍,因为第一个条件失败的概率约为 0.1%,而第二个相同条件成功?!
按如下方式更改条件后,它可以完美运行(完整代码此处):
if echo "$pid_list" | grep -F "($script_pid)" >/dev/null; then
continue
fi
Run Code Online (Sandbox Code Playgroud)
关于手册,该quiet选项的行为应该符合我的预期。如果发生错误,它甚至应该返回 true:
如果发现任何匹配,即使检测到错误,也会立即以零状态退出
所以我很困惑为什么有时会失败。机器的 RAM 和文件系统都很好。grep 二进制文件也具有正确的文件哈希值。
当我听说Icecat 和 Iceweasel时,我对在 Linux中找到Firefox 的“克隆”很感兴趣。
但是虽然 Icecat 可以安装
sudo add-apt-repository ppa:gnuzilla-team/ppa && sudo apt-get update && sudo apt-get install icecat -y

Iceweasel 是另一回事。在某一时刻,我什至被定向到 Icecat——就好像它们是同一个项目一样。他们的名字可能会引起这种印象。更多在这里。
所以 GNU/Linux 是一个操作系统,至少由几个程序组成:Linux kenel、gcc、gnu-binutils、Gnome desktop 等。
什么使 Linux 发行版成为 GNU?是编译内核的工具吗?是发行版附带的工具吗?
是否存在基于 Linux 但不基于 GNU 的全功能桌面操作系统?
我一直在调整在我的 shell 脚本和自定义函数中使用 GETOPT 和 GETOPTS,以使我能够更灵活地使用我创建的函数。在使用了许多 UNIX 函数之后,我意识到它们中的很多都使用了某种相似的语法。
示例-v用于详细输出和-R/-r递归功能。
我查看了实用程序约定的POSIX 标准指南和基于 C 的实用程序的GNU 选项表。试图了解这是否是设计使然,以及是否有任何我应该遵循的规则。
我的问题是:
1. 是否有任何具有指定含义的特定选项标志?
2. 我的选择有多少自由,我不应该违反哪些规则?
3. 我应该避免给出类似-t和-T不同含义的选项,还是应该为了简单起见将它们组合在一起?
4. 什么情况下应该使用大写或小写字母?
mv如果目录不存在,则此问题要求在使用时创建目录的最佳方法。我的问题是为什么这不是 的内置功能mv?是否有一些根本原因导致这不是一个好主意?
我正在处理一个具有自定义INSTALL文件的项目。运行automake --add-missing(或更准确地说,autoreconf -i)将生成 GNU 默认INSTALL文件,并用它覆盖我们的文件。
我怎样才能防止这种行为?我希望它要么根本不生成 GNUINSTALL文件,要么用不同的名称创建它。
另外,我不想禁用automake可能生成的任何其他文件。
编辑1:从automake手册:
如果
--add-missing给出该选项,automake将添加INSTALL文件的通用版本以及COPYING包含当前版本的 GNU 通用公共许可证 [...] 文本的文件。但是,现有COPYING文件永远不会被automake.
它说现有COPYING文件不会被覆盖,但没有说明该INSTALL文件的任何内容,因此它似乎会被无条件覆盖。
编辑 2:根据要求,这是我的configure.ac和Makefile.am,以及autogen.sh我们运行到autoreconf项目的内容:
configure.ac:
AC_INIT([program name], [version number], [bug report], [short name], [url])
AC_CONFIG_SRCDIR([Main/Source/main.cpp])
AM_PROG_AS
AC_CANONICAL_TARGET
AM_INIT_AUTOMAKE
AC_PROG_CC
AC_PROG_CXX
CFLAGS="$CFLAGS $SDL_CFLAGS "
LIBS="$LIBS $SDL_LIBS" …Run Code Online (Sandbox Code Playgroud) 使用通用 GNU/Linux 发行版(例如 Fedora/Debian/Ubuntu/等)中提供的命令行工具,是否有一种通用的方法来获取某些特定 WHOIS 字段(例如注册人的组织名称)的值,理想情况下无需构建一个硬编码的自定义 WHOIS 解析器来处理每个注册表输出之间的差异?
这似乎值得一问,因为whois命令的输出似乎不太一致。例如,比较:
$ whois trigger.io
[...]
Owner OrgName : Amir Nathoo
[...]
Run Code Online (Sandbox Code Playgroud)
和:
$ whois facebook.com
[...]
Registrant Organization: Facebook, Inc.
[...]
Run Code Online (Sandbox Code Playgroud)
相反,我希望能够作为参数传递给某些命令:
并让输出只是所需字段的值。例如,基于上面的例子,类似于:
$ some_whois_command -field organization_name trigger.io
Amir Nathoo
$ some_whois_command -field organization_name facebook.com
Facebook, Inc.
Run Code Online (Sandbox Code Playgroud)
这可能吗?
理想情况下,我想解决中心在whois与一些适合使用的命令,例如-i,-q,-t,和/或-v,因为我想学习如何有效地使用这些选项。但是,如有必要,我会接受另一个正确的解决方案。
gnu ×10
linux ×3
grep ×2
posix ×2
automake ×1
autoreconf ×1
autotools ×1
bash ×1
browser ×1
bsd ×1
command-line ×1
disk-usage ×1
find ×1
firefox ×1
mkdir ×1
mv ×1
newlines ×1
performance ×1
sed ×1
shell ×1
shell-script ×1
sles ×1
whois ×1