问题列表 - 第5470页

即使最后一次替换不成功,sed 条件分支“t”也会保持分支

我有以下 sed 表达式:

echo 'abcabcabc' | sed -n ':-A s/a/x/1; s/a/&/2;t-A; p'
Run Code Online (Sandbox Code Playgroud)

据说应该用除最后一个之外'a'的所有出现替换。'x'所以,预期的输出是这样的:

xbcxbcabc
Run Code Online (Sandbox Code Playgroud)

但实际输出是这样的:

xbcxbcxbc
Run Code Online (Sandbox Code Playgroud)

将全部替换'a''x'

我知道已经有类似的问题了,比如 替换每行中除最后一个字符之外的每个字符

但我在这里尝试使用 sed 条件分支的不同方法。

让我用我自己的理解来分解我的 sed 表达式

首先是 sed 表达式:

xbcxbcabc
Run Code Online (Sandbox Code Playgroud)

sed 将其拉abcabcabc入模式空间

然后设置一个标签:-A

然后s/a/x/1;将第一次出现的 替换'a''x'。现在模式空间包含这个xbcabcabc

s/a/&/2;检查模式空间是否包含两个'a',它确实包含两个 ,因此它'a'用它们自己替换这两个&。所以模式空间仍然包含这个xbcabcabc

t-A由于最近的替换成功,跳回标签-A

从标签开始,-A它再次执行此操作s/a/x/1;,将模式空间的内容从 this 变为xbcabcabcthisxbcxbcabc

s/a/&/2它检查是否还有两个'a'。这次模式空间包含 thisxbcxbcabc …

sed text-processing

5
推荐指数
1
解决办法
304
查看次数

使用 Find 列出文件并在输出中包含计数器值

出于性能原因,我想用来find列出大量文件,但也在每行上包含一个计数器。以下是我到目前为止所拥有的:

local root_dir="."
local ouptut_file="/tmp/foo.txt"

File_Number=99              ## Initial value

echo "" > "${ouptut_file}"  ## Initialize file to empty

find "$root_dir"   \
    -type f        \
    -depth 2       \
    -name '*.xxx'  \
    -print0        \
| sort -z          \
| xargs -0  printf "DoSomething %5d '%s'\n" $[File_Number++] -- \
> "${ouptut_file}"
Run Code Online (Sandbox Code Playgroud)

这输出

DoSomething    99 '--'
DoSomething     0 'dirA/dirB/file1.xxx'
DoSomething     0 'dirA/dirB/file2.xxx'
DoSomething     0 'dirA/dirB/file3.xxx'
Run Code Online (Sandbox Code Playgroud)

我想要的是

DoSomething     100 'dirA/dirB/file1.xxx'
DoSomething     101 'dirA/dirB/file2.xxx'
DoSomething     102 'dirA/dirB/file3.xxx'
Run Code Online (Sandbox Code Playgroud)

如何包含计数器并消除输出中的第一个杂散线。

系统bash:正在macOS Ventura 13.0.1 上使用

bash find shell-script macos

4
推荐指数
1
解决办法
399
查看次数

分发带有源代码的内核模块的最佳方法是什么?

我有一个内核模块,我想分发它(即打包它)。

我想分发它,以便用户不需要做任何其他事情yum/dnf install kmod-mymodule

  • SRPM:用户必须在其计算机上构建 RPM,然后安装 RPM。我无法将其放入 yum 存储库
  • RPM:我必须为 RHEL 的所有主要和次要版本构建 RPM。
  • DKMS:可能是解决方案,但它希望用户知道如何使用 dkms,而不是那么透明。

有什么方法可以轻松分发内核模块,以便用户只需要做yum install kmod-mymodule即可为特定机器编译模块?

如果有一个与分发无关的解决方案,我洗耳恭听!

rpm rhel kernel-modules

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

使用 awk 将 1 秒添加到 yyyymmddhhmmss

我有这个文件,其中第七个字段是 yyyymmddhhmmss。我需要将这个数字增加一秒。

到目前为止,我已经想出了:

awk 'BEGIN{FS=OFS="|"} $7=$7+1 ' <file> 
Run Code Online (Sandbox Code Playgroud)

它有点工作,但是......如果第七个字段的最后两位数字是“59”,它显然会替换为“60”。

有什么方法可以让 awk 知道该字段是日期,这样我就可以将整个列增加一秒?

当前文件

09099458|1|000|41181|0|0|20221130164738|67
82060649|1|000|36827|0|0|20221130172359|67
Run Code Online (Sandbox Code Playgroud)

预期结果

09099458|1|000|41181|0|0|20221130164739|67
82060649|1|000|36827|0|0|20221130172400|67  <- From 17:23:59 to 17:24:00
Run Code Online (Sandbox Code Playgroud)

提前致谢。

awk time replace

0
推荐指数
1
解决办法
160
查看次数

使用sed插入特殊字符的解决方案

我正在尝试使用 sed 来替换tex 文件中的&by 。\&我正在使用sed -i "s/ & / \\\& /g" bibfile.bib; 但是,文件中的结果\ &并不\&符合我的预期。欢迎任何帮助,马克

sed

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

如何在 bash 中连接如下单词

我在 Linux 机器上有一个文件words.txt,包含以下几行。如何重复每个字符串userapplebanana,并向它们附加 1 到 4 之间的数字?

user
apple
banana
Run Code Online (Sandbox Code Playgroud)

预期输出:

user1
user2
user3
user4
apple1
apple2
apple3
apple4
banana1
banana2
banana3
banana4

Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法,但只适用于 1 个字符串。

seq 1 4 | awk {'print $0 "user"'}
Run Code Online (Sandbox Code Playgroud)

scripting text-processing

4
推荐指数
1
解决办法
443
查看次数

为什么 Linux 上的进程使用大量内存但仍小于可用交换空间量时会崩溃?

我正在使用 Linux 5.15 和 Ubuntu 22.04。

我有一个使用大量内存的进程。它需要的内存比我机器上的 RAM 还要多。我第一次运行它时,它被 OOM Killer 杀死了。我的理解是:系统内存不足,OOM Killer 被触发,我的进程被杀死。这是有道理的。我也确信这就是发生的事情:我看了一下dmesg,一切都在那里。

所以我添加了一些交换空间。我不介意这个过程是否需要很长时间才能运行:我不会经常运行它。

我再次运行该过程。这次比第一次跑的时间更长。整个系统变得非常滞后,系统在进行大量交换时就会出现这种情况。它似乎起作用了……然后就死了。不仅进程死了,它的父进程 shell 进程也死了,它的父进程 Tmux 进程、Tmux 进程的父进程 shell 进程,甚至它的父 GNOME 终端进程也死!但随后谋杀过程停止了:不再有父母死亡。

起初,我以为 OOM Killer 再次被触发——尽管仍有大量交换空间可用——并且它选择终止 GNOME 终端进程。但我查了dmesg一下,journalctl -k并没有什么新的东西。没有任何迹象表明 OOM Killer 已被触发。

那么,第一个问题:是否有任何情况可以触发 OOM Killer,而不将任何内容记录到内核环形缓冲区?

让我困惑的是,Linux 内核似乎已经开始交换,但不知何故它交换得不够……或者交换得不够快……或者其他什么。

所以我增加了vm.swappiness。这确实不应该影响系统稳定性:它只是一个用于性能优化的旋钮。即使vm.swappiness设置为0内核,当区域中的可用内存降至临界阈值以下时,内核仍应开始交换。

但似乎它已经开始交换,但交换得还不够……所以我增加了vm.swappiness鼓励100它交换更多一点。

然后我再次运行该过程。整个系统变得非常滞后,系统在进行大量交换时就会这样做......直到进程成功运行完成。

那么,第二个问题:为什么内核不使用可用的交换空间,即使空闲内存已降至临界阈值以下并且肯定有足够的可用交换空间?为什么改变会vm.swappiness带来改变?

更新:

进一步的测试表明该设置vm.swappiness不是一个可靠的解决方案。即使vm.swappinessset to ,我也遇到过一些失败100。它可能会提高该过程成功完成的机会,但我不确定。

linux swap linux-kernel out-of-memory

9
推荐指数
2
解决办法
1638
查看次数

是否有“可执行目录”之类的东西?

在 MacOS 中,您可以使用后缀命名文件夹.app,并且可以根据内部文件夹结构约定将其作为应用程序从 GUI 启动。

Linux 中存在这样的东西吗?

例如,我可以将一个目录标记为可执行文件吗?当尝试执行该目录时(无论是从 CLI 还是从 GUI),Linux 将在内部查找./main(或类似的)来执行。

编辑:

这主要只是出于好奇,但就行为而言,我希望知道是否有某种方法可以用一些元数据标记文件夹,告诉 Linux 将其用作内部保存的二进制文件的代理 - 类似于:

mkdir hello-world.app

# Create executable inside folder
echo "#!/bin/bash" > hello-world.app/bin/main
echo "echo Hello World" >> hello-world.app/bin/main

# Add some kind of meta-data to tell Linux what to do when executing folder
echo "execute=bin/main" > hello-world.app/app_manifest

# Mark as executable
chmod +x ./hello-world.app

# Run folder
./hello-world.app

# "Hello World"
Run Code Online (Sandbox Code Playgroud)

我的想法是,这将是一种方便、省力的方式来分发应用程序及其依赖项、文档,同时也可以作为配置的方便目的地。

我想如果一个软件需要一个与系统上安装的动态库不同的动态库,您只需下载适当的动态库并将其放入,hello-world.app/lib二进制文件会更喜欢本地库而不是系统库。

我知道 Linux 的约定是使用/usr/local …

linux executable

5
推荐指数
1
解决办法
300
查看次数

Wireguard指定监听地址

有没有办法将 Linuxwireguard 模块配置为仅侦听特定 IP 地址的传入连接,而不是默认侦听所有可用地址?我找不到这方面的任何文档。

linux wireguard

5
推荐指数
1
解决办法
2482
查看次数

从 TitleCase -&gt; Title Case 批量重命名文件(空格分隔)

我有一个 38GB 的​​文件夹,里面有 800 个 MP4 视频。重新下载后,文件名没有空格,所有单词都连在一起,但还是TitleCase。

所以从TitleCase我需要Title Case

批量重命名这些文件的最有效方法是什么?

我记得很久以前我的发行版中就包含了renameautorename,但现在似乎没有了。

rename

5
推荐指数
2
解决办法
4011
查看次数