按照我的理解,$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)
为什么会这样?
我总是这样做来将文本附加到文件中
echo "text text text ..." >> file
# or
printf "%s\n" "text text text ..." >> file
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更多方法可以实现相同、更优雅或更不寻常的方式。
有一个gz格式的40GB文件。我想查找cksum
未压缩格式的该文件的记录数。我的一种方法是:
gunzip
wc
,命令cksum
gzip
。这种方法的问题是提取和压缩文件将花费大量时间。可能需要 30-40 分钟左右。另一种方法可能是用来zcat
计算记录数和cksum
zcat <file name> | wc -l
zcat <file name> | cksum
这种方法可能需要更少的时间,但zcat
对同一个文件使用两次。有更好的方法吗?可能正在使用一个命令来查找记录计数和cksum
?
我写了一个小脚本来自动将我的蓝牙耳机连接到我的 linux 机器。
#!/bin/bash
bluetoothctl
wait ${!}
connect XX:XX:XX:XX:XX:XX #headphone MAC address
wait ${!}
exit
Run Code Online (Sandbox Code Playgroud)
脚本打开bluetoothctl
但不运行以下任何命令。
在 bash 中,我通常会grep -f <(command) ...
(例如我选择 grep)来模拟文件输入。
鱼壳中的等价物是什么?我在文档中找不到它。
我有一个包含此内容的文件:
$ 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) 为什么这个管道会截断文件:
awk '...' file | tee file
Run Code Online (Sandbox Code Playgroud)
而cat
ing 首先不是吗?
cat file | awk '...' | tee file
Run Code Online (Sandbox Code Playgroud)
该文件只是一个包含数百行的常规配置文件。我习惯tee
避免使用sponge
(因为我必须先安装moreutils
)。
我想写一个数据解析器脚本。示例数据为:
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) 我有一长串类似的东西:
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:]])
,也没用。
我错过了什么?
我们有一个由 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这是 .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) 我目前有两个 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()只和抑制运行download
和upload
备用。