标签: gnu

BSD sed 与 gsed 中的换行符

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)

我们如何解释这种行为差异?

bsd sed gnu newlines

7
推荐指数
1
解决办法
1065
查看次数

测量每个目录的特定文件类型的磁盘使用情况(递归地,作为“du --include”的演示)

这是我的工作代码,但我相信它没有优化 - 必须有一种方法可以比这更快地完成工作:

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 个是排序输出,但 …

performance bash find gnu disk-usage

7
推荐指数
2
解决办法
1079
查看次数

仅在最后一次出现令牌后才打印文件内容?

我有可以重新启动其内部状态的长时间运行的程序。我只想查看最新状态的日志文件条目(加载到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 gnu text-processing

7
推荐指数
2
解决办法
438
查看次数

grep --quiet 的退出状态有错误吗?

我有一些带有 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 二进制文件也具有正确的文件哈希值。

搜索了一个提交,但我找到的唯一一个是2001 年的,它应该是 …

grep gnu sles

7
推荐指数
1
解决办法
1317
查看次数

Icecat 和 Iceweasel 是不同的项目吗?

当我听说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——就好像它们是同一个项目一样。他们的名字可能会引起这种印象。更多在这里

firefox gnu browser

6
推荐指数
1
解决办法
7364
查看次数

什么是 GNU 发行版,是否有非 GNU 的 Linux 发行版?

所以 GNU/Linux 是一个操作系统,至少由几个程序组成:Linux kenel、gcc、gnu-binutils、Gnome desktop 等。

  • 什么使 Linux 发行版成为 GNU?是编译内核的工具吗?是发行版附带的工具吗?

  • 是否存在基于 Linux 但不基于 GNU 的全功能桌面操作系统?

linux gnu distributions

6
推荐指数
3
解决办法
2483
查看次数

shell 脚本和函数的通用标志名称和标准

我一直在调整在我的 shell 脚本和自定义函数中使用 GETOPT 和 GETOPTS,以使我能够更灵活地使用我创建的函数。在使用了许多 UNIX 函数之后,我意识到它们中的很多都使用了某种相似的语法。

示例-v用于详细输出和-R/-r递归功能。

我查看了实用程序约定POSIX 标准指南基于 C 的实用程序GNU 选项表。试图了解这是否是设计使然,以及是否有任何我应该遵循的规则。

我的问题是:
1. 是否有任何具有指定含义的特定选项标志?
2. 我的选择有多少自由,我不应该违反哪些规则?
3. 我应该避免给出类似-t-T不同含义的选项,还是应该为了简单起见将它们组合在一起?
4. 什么情况下应该使用大写或小写字母?

shell gnu shell-script posix

6
推荐指数
1
解决办法
2119
查看次数

`mv` 有能力创建目录吗?

mv如果目录不存在,则问题要求在使用时创建目录的最佳方法。我的问题是为什么这不是 的内置功能mv?是否有一些根本原因导致这不是一个好主意?

linux gnu posix mkdir mv

6
推荐指数
1
解决办法
2万
查看次数

如何防止automake覆盖INSTALL?

我正在处理一个具有自定义INSTALL文件的项目。运行automake --add-missing(或更准确地说,autoreconf -i)将生成 GNU 默认INSTALL文件,并用它覆盖我们的文件。

我怎样才能防止这种行为?我希望它要么根本不生成 GNUINSTALL文件,要么用不同的名称创建它。

另外,我不想禁用automake可能生成的任何其他文件。


编辑1:automake手册

如果--add-missing给出该选项,automake将添加INSTALL文件的通用版本以及COPYING包含当前版本的 GNU 通用公共许可证 [...] 文本的文件。但是,现有COPYING 文件永远不会被automake.

它说现有COPYING文件不会被覆盖,但没有说明该INSTALL文件的任何内容,因此它似乎会被无条件覆盖。

编辑 2:根据要求,这是我的configure.acMakefile.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 automake autoreconf autotools

6
推荐指数
2
解决办法
1435
查看次数

无需解析即可获取 WHOIS 数据字段?

使用通用 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,因为我想学习如何有效地使用这些选项。但是,如有必要,我会接受另一个正确的解决方案。

linux command-line gnu whois

6
推荐指数
1
解决办法
3076
查看次数