在标准输出中显示此处文档传递的行:
cat <<EOF
foo
bar
baz
EOF
foo
bar
baz
我想通过管道用 grep 匹配一些字符串:
cat <<EOF
foo
bar
baz
EOF
|grep 'ba'
为什么不能通过管道传递 grep 命令的标准输出?
在标准输出中显示此处文档传递的行:
cat <<EOF
foo
bar
baz
EOF
foo
bar
baz
我想通过管道用 grep 匹配一些字符串:
cat <<EOF
foo
bar
baz
EOF
|grep 'ba'
为什么不能通过管道传递 grep 命令的标准输出?
我刚刚看到了一个使用将多个事物放入管道的示例(用于)。echo
jq
echo '{"A": {"a": 1}}' '{"A": {"b": 2}}' '{"B": 3}' |\
jq --slurp 'reduce .[] as $item ({}; . * $item)'
如果我理解正确的话,这似乎在一端将三个对象放入管道,在另一端jq
接收它们并将它们放入数组中,并使用合并运算符将其减少。
这让我很惊讶,我不确定如何在 中拥有多个东西stdin
。
更具体地说,系统如何知道输入是三个文件以及每个文件在哪里开始/结束?
如果我只执行回显部分echo '{"A":1}' '{"A": {"b": 2}}' '{"B": 3}'
,则输出似乎在三个对象之间没有任何可见的分隔符:
{"A":1} {"A": {"b": 2}} {"B": 3}
单引号是否有一些特殊效果,可以告诉下一个过滤器(jq
)边界?或者 jq 如何知道边界?
(这是 Ubuntu 24.04,jq 1.7.1)
在网络隔离 OpenBSD 全新安装的默认终端上执行 SHA256d 哈希(双 SHA256)的好方法是什么?
这就是我正在做的:
echo test > testfile
cat testfile | openssl dgst -binary | openssl dgst
它给了我一个以0xe0b6
只是想知道是否有更简洁/更好的方法?
我已配置 rsyslog 将某些日志消息转发到命名管道/tmp/logger.pipe
。然后我有一个单独的进程从命名管道读取数据。相关部分来自/etc/rsyslog.conf
# Remote Logging (silly conditional rule needed for specific logging scenario)
$template RFC5424Format,"<%PRI%>1 %timegenerated:1:10:date-rfc3339%T%timegenerated:12:19:date-rfc3339%.%timegenerated:21:26:date-rfc3339%Z %HOSTNAME% - - -%msg%\n"
if ($msg contains 'remote="true"') then /tmp/logger.pipe;RFC5424Format
/tmp/logger.pipe 的权限
prwxrwxrwx 1 ftp root
我正在将此应用程序部署到两台不同的机器上。一台机器配备 rsyslog v3.xx,另一台机器配备 v5.xx
该应用程序在使用 rsyslog v5.xx 的计算机上运行良好,但是,我在使用 rsyslog v3.xx 的计算机上遇到奇怪的行为具体来说:
logger.pipe
重新启动时,rsyslogd 似乎在侦听进程恢复后停止将数据写入命名管道。解决此问题的唯一方法是手动重新启动 rsyslogd在使用命名管道时,我缺少 rsyslog 配置的一些技巧吗?我可能忽略的其他权限问题吗?我对该应用程序充满信心,因为它在 v5.xx rsyslog 版本中运行得非常稳定。不幸的是,我无法在遇到问题的机器上更新 v3.xx 版本。
有什么想法吗?
更新:我可能已经诊断出这个问题 - 这似乎是一个问题,如果没有读者,rsyslogd 会关闭到管道的写入连接。但是,读取器应用程序使用 fopen(),它会阻塞,直到出现相应的写入器为止。
由于某种原因,这在 rsyslog v5.xx 上不是问题:
但这种行为在 rsyslog v3.xx 上有所不同:
参考这个https://stackoverflow.com/a/31356602,我写了这段代码:
#!/bin/bash
# Define the two strings to compare
string1="First string with some random text."
string2="Second string with some random text and some changes."
# Create a temporary directory
temp_dir=$(mktemp -d)
# Create temporary files for the strings
file1="$temp_dir/string1.txt"
file2="$temp_dir/string2.txt"
echo -e "$string1" > "$file1"
echo -e "$string2" > "$file2"
# Use the git diff command to compare the temporary files
git diff --no-index --word-diff=color --word-diff-regex=. "$file1" "$file2"
# Delete the temporary directory
rm -rf "$temp_dir"
返回:
现在我试图将它压缩成一行:
#!/bin/bash
# Define the two strings to compare
string1="First string with some random text."
string2="Second string with some random text and some changes."
# Use the git diff command to compare the strings
git diff --no-index --word-diff=color --word-diff-regex=. <('%s\n' "$string1") <(printf '%s\n' "$string2")
但我得到:
如何在git diff
不显式创建临时文件的情况下将字符串作为文件传递?
笔记。我的目标是“直观地”比较(字符级)两个(短)字符串,获得与此类似的输出:
其中两个比较字符串之间的差异在单个字符串中突出显示。的输出git diff
是理想的,但我也愿意接受其他解决方案。
我正在运行一个脚本(在 Laravel 项目中),需要几个小时才能完成。nohup
以防止它在我的 ssh 会话断开连接时退出。
nohup php artisan do:thing 2>&1 | tee ~/tmp
它开始得很好,但一段时间后,我收到一个损坏的管道错误,它停止输出内容,并且tee
也停止 - 文档在那时停止。
我猜这是因为tee
进程被 ssh 会话丢弃杀死了?我可以阻止它吗?
我可以否认 tee 进程并阻止 ssh 终止它吗?
我正在尝试捕获/传输以下内容的输出:
arecord -f S16_LE -qd 5 文件 && sox 文件 -n stat
输出:
读取样本:8000 长度(秒):1.000000 缩放比例:2147483647.0 最大幅度:0.992188 最小幅度:-0.992188 中线幅度:0.000000 平均范数:0.093221 平均幅度:-0.015338 RMS 幅度:0.232947 最大增量: 0.617188 最小增量:0.000000 平均增量:0.001067 RMS 增量:0.009643 粗略频率:52 音量调节:1.008
我需要捕获数据以转换为 json。问题是“SOX”似乎违背了我通常用来捕获/管道标准输出的任何方法。有什么建议吗?
我感觉这个应该很简单。我有一个包含超过 1000 个 gzip 压缩文件的目录。我想将它们全部压缩并连接起来。
运行gzip -dk *.gz | cat > output.file
会产生以下错误:Too many levels of symbolic links
有想法吗?
我正在尝试将多个输入文件/流连接成一个流(使用虚构命令stream-cat
),将该流通过管道传输到ssh
远程主机并在远程主机上将其分离回单独的文件/流(stream-sep
),如本例所示,用于演示仅用于:
stream-cat <( zfs send tank/vm@snapshot ) somefile.txt | ssh user@host "stream-sep >( zfs receive tank/vm@snapshot ) somefile.txt"
示例说明:zfs send
输出大量数据,其大小事先未知(这就是tar
无法处理的原因)。该数据流与常规文件的内容连接在一起somefile.txt
。生成的流通过管道输送到ssh
,在那里再次分离。第一个流通过管道传输到zfs receive
,而第二个流写入常规文件。
这样的程序应该通过读取块中的不可搜索流并始终写入块大小后跟数据来实现,直到到达流的末尾。开销将是最小的。
这样的程序已经存在了吗?