小编ann*_*hri的帖子

如何` ... | awk '$1=$1'` 删除多余的空格?

按照我的理解,$1是第一个字段。但奇怪的是,awk '$1=$1'省略了额外的空格。

$ echo "$string"
foo    foo bar               bar

$ echo "$string" | awk '$1=$1'
foo foo bar bar
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

awk

17
推荐指数
2
解决办法
3865
查看次数

将文本附加到文件的方法

我总是这样做来将文本附加到文件中

echo "text text text ..." >> file
# or
printf "%s\n" "text text text ..." >> file
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更多方法可以实现相同、更优雅或更不寻常的方式。

shell shell-script

13
推荐指数
4
解决办法
2324
查看次数

压缩文件上记录计数和 cksum

有一个gz格式的40GB文件。我想查找cksum未压缩格式的该文件的记录数。我的一种方法是:

  1. 使用解压缩文件gunzip
  2. 对解压文件使用wc,命令cksum
  3. 使用 再次压缩文件gzip

这种方法的问题是提取和压缩文件将花费大量时间。可能需要 30-40 分钟左右。另一种方法可能是用来zcat计算记录数和cksum

  1. zcat <file name> | wc -l
  2. zcat <file name> | cksum

这种方法可能需要更少的时间,但zcat对同一个文件使用两次。有更好的方法吗?可能正在使用一个命令来查找记录计数和cksum

bash compression shell-script checksum

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

脚本不在 bluetoothctl 中运行命令

我写了一个小脚本来自动将我的蓝牙耳机连接到我的 linux 机器。

#!/bin/bash

bluetoothctl
wait ${!}
connect XX:XX:XX:XX:XX:XX #headphone MAC address
wait ${!}
exit
Run Code Online (Sandbox Code Playgroud)

脚本打开bluetoothctl但不运行以下任何命令。

scripting bash shell-script bluetooth

4
推荐指数
2
解决办法
2714
查看次数

Bash 的进程替换 "&lt;(command)" 在鱼壳中等效

在 bash 中,我通常会grep -f <(command) ...(例如我选择 grep)来模拟文件输入。

鱼壳中的等价物是什么?我在文档中找不到它。

fish

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

从文件中查找整行匹配的文件

我有一个包含此内容的文件:

$ cat compromised_header.txt
some unique string 1
some other unique string 2
another unique string 3
Run Code Online (Sandbox Code Playgroud)

我想找到所有具有上述文件所有行的文件的顺序完全相同,并且这些行之间没有中间行。

示例输入文件:

$ cat a-compromised-file.txt
some unique string 1
some other unique string 2
another unique string 3
unrelated line x
unrelated line y
unrelated line z
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下grep

grep -rlf compromised_header.txt dir/
Run Code Online (Sandbox Code Playgroud)

但我不确定它会给出预期的文件,因为它也会匹配这个文件:

some unique string 1
unrelated line x
unrelated line y
unrelated line z
Run Code Online (Sandbox Code Playgroud)

grep awk perl text-processing

4
推荐指数
2
解决办法
636
查看次数

为什么“awk ... file | tee file”会截断文件?

为什么这个管道会截断文件:

awk '...' file | tee file
Run Code Online (Sandbox Code Playgroud)

cating 首先不是吗?

cat file | awk '...' | tee file
Run Code Online (Sandbox Code Playgroud)

该文件只是一个包含数百行的常规配置文件。我习惯tee避免使用sponge(因为我必须先安装moreutils)。

awk text-processing

3
推荐指数
1
解决办法
447
查看次数

带有键值记录的压缩文件到 CSV

我想写一个数据解析器脚本。示例数据为:

name: John Doe
description: AM
email: john@doe.cc
lastLogon: 999999999999999
status: active
name: Jane Doe
description: HR
email: jane@doe.cc
lastLogon: 8888888888
status: active
...
name: Foo Bar
description: XX
email: foo@bar.cc
status: inactive
Run Code Online (Sandbox Code Playgroud)

键值对始终处于相同的顺序 ( name, description, email, lastLogon, status),但某些字段可能会丢失。也不保证第一条记录是完整的。

预期的输出是分隔符分隔的(例如 CSV)值:

John Doe,AM,john@doe.cc,999999999999999,active
Jane Doe,HR,jane@doe.cc,8888888888,active
...
Foo Bar,XX,foo@bar.cc,n/a,inactive
Run Code Online (Sandbox Code Playgroud)

我的解决方案是使用 whileread循环。我的脚本的主要部分:

name: John Doe
description: AM
email: john@doe.cc
lastLogon: 999999999999999
status: active
name: Jane Doe
description: HR
email: jane@doe.cc
lastLogon: 8888888888
status: active …
Run Code Online (Sandbox Code Playgroud)

bash awk perl text-processing

3
推荐指数
1
解决办法
77
查看次数

为什么这个正向前瞻正则表达式 'string.*?(?= )' 在 sed 中不起作用?

我有一长串类似的东西:

AllowedUsers aaaa01@11.22.33.44 aaaa03@11.22.55.77 bbbb11@99.99.99.99 ccc00@11.0.0.11 .....
Run Code Online (Sandbox Code Playgroud)

全部在一行中。基本上它是一堆用户名@ip

我只想使用其用户名(例如 aaa)进行查找和替换,然后将其替换为空。

我测试了我的正则表达式(RegExr),它按我的预期工作。但是当我尝试这样做时sed,它没有用。

AllowedUsers aaaa01@11.22.33.44 aaaa03@11.22.55.77 bbbb11@99.99.99.99 ccc00@11.0.0.11 .....
Run Code Online (Sandbox Code Playgroud)

我也试过用bbbb11.*?(?=[[:space:]]),也没用。

我错过了什么?

sed text-processing regular-expression

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

Systemd 不会重生进程

我们有一个由 systemd 处理的永久运行的 shell 脚本,该脚本运行良好,直到几天前,由于一些巨大的日志文件,我们的服务器存储已 100% 使用。我必须截断这些文件才能释放一些空间。

\n\n

今天,我收到报告称该脚本已停止运行。但当我检查状态时,它说:

\n\n
\xe2\x97\x8f ImportantService.service - Important daemon\n   Loaded: loaded (/etc/systemd/system/ImportantService.service; enabled; vendor preset: disabled)\n   Active: active (exited) since Wed 2020-04-29 16:46:48 WIB; 5 days ago\n  Process: 48877 ExecStop=/usr/local/bin/importantScript stop --instance XYZ (code=exited, status=0/SUCCESS)\n  Process: 48889 ExecStart=/usr/local/bin/importantScript start --instance XYZ (code=exited, status=0/SUCCESS)\n Main PID: 48889 (code=exited, status=0/SUCCESS)\n    Tasks: 0\n   Memory: 48.0K\n   CGroup: /system.slice/ImportantService.service\n
Run Code Online (Sandbox Code Playgroud)\n\n

我注意到它有 0 个任务,因此我手动重新启动它。现在已经正常运行了。我怀疑是我之前提到的问题造成的。

\n\n

问题是,如果以后出现此类问题,如何让systemd重生进程呢?

\n\n
\n\n

这是 .service 文件:

\n\n
[Unit]\nDescription= Important daemon\n\n[Service]\nType=oneshot\nExecStart=/usr/local/bin/importantScript start --instance XYZ\nRemainAfterExit=true\nExecStop=/usr/local/bin/importantScript stop --instance …
Run Code Online (Sandbox Code Playgroud)

linux systemd

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

如何创建一个主 bash 脚本,允许用户输入他们想要运行的两个函数中的哪一个?

我目前有两个 bash 函数,一个用于上传,另一个用于下载文件。我想创建一个 bash 脚本,允许用户指定他们想要做的两个中的哪一个。

我遇到的问题是上传和下载功能无论如何都会运行。例如:

function upload() {
    var=$1
    #something goes here for upload
}

function download() {
    var=$1
    #something here for download
}

main() {
        case "$1" in
            -d) download "$2";;
            -u) upload "$2";;
            *) "Either -d or -x needs to be selected"
        esac
}
Run Code Online (Sandbox Code Playgroud)

我不能得到的main()只和抑制运行downloadupload备用。

bash function

-1
推荐指数
1
解决办法
140
查看次数