我准备把这个作为一个问题发布,但是经过一段时间的努力,我找到了解决方案.所以我想我会继续把它发布在这里,以防它帮助其他人.
我遇到了查找-exec cmd +的问题.我收到了错误:
$ find ./ -name "*JIM*" -exec cp {} $TARGET_DIR +
find: missing argument to `-exec'
Run Code Online (Sandbox Code Playgroud)
如果我用的话,它有效
$ find ./ -name "*JIM*" -exec cp {} $TARGET_DIR \;
Run Code Online (Sandbox Code Playgroud)
但是我不想使用它,因为它为每个找到的文件分配了一个新进程.
如果我用的话它会起作用
$ find ./ -name "*JIM*" -exec ls {} +
Run Code Online (Sandbox Code Playgroud)
它列出了我要复制的所有文件.但-exec cp {} $TARGET_DIR +没有奏效.
我找到的解决方案是:
$ find ./ -name "*JIM*" -exec cp --target-directory=$TARGET_DIR {} +
Run Code Online (Sandbox Code Playgroud)
哪里--target-directory=也可以替换-t
希望这可以帮助.
awk可以使用 strftime 函数生成时间戳,例如
$ awk 'BEGIN {print strftime("%Y/%m/%d %H:%M:%S")}'
2019/03/26 08:50:42
Run Code Online (Sandbox Code Playgroud)
但我需要一个带有小数秒的时间戳,最好是纳秒。gnu date可以用以下%N元素做到这一点:
$ date "+%Y/%m/%d %H:%M:%S.%N"
2019/03/26 08:52:32.753019800
Run Code Online (Sandbox Code Playgroud)
但与调用相比,date从内部调用的效率相对较低,而且我需要高性能,因为我正在处理许多大文件,并且需要在处理文件时生成许多时间戳。有没有一种方法可以有效地生成包含小数秒的时间戳(理想情况下是纳秒,但毫秒也是可以接受的)?awkstrftimeawkawk
添加我正在尝试执行的示例:
awk -v logFile="$logFile" -v outputFile="$outputFile" '
BEGIN {
print "[" strftime("%Y%m%d %H%M%S") "] Starting to process " FILENAME "." >> logFile
}
{
data[$1] += $2
}
END {
print "[" strftime("%Y%m%d %H%M%S") "] Processed " NR " records." >> logFile
for (id in data) {
print id …Run Code Online (Sandbox Code Playgroud) 如果配置文件中未定义默认值,那么使用默认值的最佳方法是什么?例如,在下面的示例中,可能仅listen_address在配置中定义,并且listen_port不存在。
我正在尝试这样的事情:
import ConfigParser
from os.path import isfile
if __name__ == "__main__":
# Set default values
listen_address = '127.0.0.1'
listen_port = 8000
# Check for configurations from file and override defaults
configFile = './configuration.ini'
if isfile(configFile):
configs = ConfigParser.ConfigParser()
configs.read(configFile)
try:
listen_address = configs.get('ServerConfigs', 'listen_address')
except:
pass
try:
listen_port = configs.get('ServerConfigs', 'listen_port')
except:
pass
Run Code Online (Sandbox Code Playgroud)
但这感觉很丑。
在 Kubernetes 中是否可以将 ConfigMap 中的文件挂载到已有其他文件的目录中?例如
基础镜像文件系统:
/app/
main/
main.py
test.py
Run Code Online (Sandbox Code Playgroud)
ConfigMap 包含一个文件 Mounted.py,该文件应与 main.py 和 test.py 一起安装在 /app/main/ 中。
部署后所需的文件系统:
/app/
main/
main.py
test.py
mounted.py
Run Code Online (Sandbox Code Playgroud)
到目前为止我所看到的是 ConfigMap 被安装到一个新目录,所以我最接近的是这样的:
/app/
main/
main.py
test.py
mounted/
mounted.py
Run Code Online (Sandbox Code Playgroud)
如果我将 ConfigMap 安装到 /app/main,那么它会破坏基础映像中的现有文件。例如
/app/
main/
mounted.py
Run Code Online (Sandbox Code Playgroud)
有没有像这样注入单个文件的好方法?(实际上,在我的实际用例中是多个文件。)我不希望为 ConfigMap 注入的所有内容设置单独的目录,因为它偏离了标准程序架构。
当awk使用分隔符分割的线成字段,它保持在原来的行$0的变量.因此,$0在对各个字段执行操作之后,它可以打印原始行(假设没有其他任何修改).bash可以read做类似的事情,它不仅有个别元素,还有整条线?
例如,具有以下内容 input.txt
foo,bar
baz,quz
Run Code Online (Sandbox Code Playgroud)
awk我试图在bash中模仿的行为是:
awk -F, '($1 == "baz") {print $0}' input.txt
这将打印,baz,quz因为$0是读取的整行,即使该行也被拆分为两个字段($1和$2).
击:
while IFS=, read -r first second; do
if [[ "$first" == lemur ]]; then
# echo the entire line
fi
done < input.txt
Run Code Online (Sandbox Code Playgroud)
在这个简单的情况下,通过在它们之间用逗号回显$first和$second变量来重新创建原始行并不太困难.但是在更复杂的情况下,IFS可能有多个字符并且可能有许多字段,除非bash在读取操作期间维护它,否则准确地重新创建原始行变得更加困难.
bash 如何等待进程替换中使用的子 shell 在以下构造中完成?(这当然是从我正在使用的真实 for 循环和子 shell 简化而来的,但它很好地说明了意图。)
for i in {1..3}; do
echo "$i"
done > >(xargs -n1 bash -c 'sleep 1; echo "Subshell: $0"')
echo "Finished"
Run Code Online (Sandbox Code Playgroud)
印刷:
Finished
Subshell: 1
Subshell: 2
Subshell: 3
Run Code Online (Sandbox Code Playgroud)
代替:
Subshell: 1
Subshell: 2
Subshell: 3
Finished
Run Code Online (Sandbox Code Playgroud)
如何让 bash 等待这些子 shell 完成?
更新
使用进程替换的原因是我想使用文件描述符来控制打印到屏幕的内容以及发送到进程的内容。这是我正在做的事情的完整版本:
for myFile in file1 file2 file3; do
echo "Downloading $myFile" # Should print to terminal
scp -q $user@$host:$myFile ./ # Might take a long time
echo "$myFile" >&3 # …Run Code Online (Sandbox Code Playgroud) 我正在尝试按照此处的说明将 PostgreSQL 9.6 数据库从我的 openSUSE 64 位机器复制到我的 Mint 64 位机器。
但是当我psql在从服务器上启动时,出现以下错误:
FATAL: database files are incompatible with server
DETAIL: The database cluster was initialized without USE_FLOAT8_BYVAL but the server was compiled with USE_FLOAT8_BYVAL.
HINT: It looks like you need to recompile or initdb.
LOG: database system is shut down
Run Code Online (Sandbox Code Playgroud)
我可以initdb在 master 中重新运行(其中还没有重要数据),并使用使其工作所需的任何设置,但我还没有在initdb手册页中看到to的选项USE_FLOAT8_BYVAL,并且我的搜索正在出现空的如何去做。
编辑:这些是我正在使用的版本:
version
-------------------------------------------------------------------------------------------------------------------------------------------------
PostgreSQL 9.6.11 on x86_64-pc-linux-gnu (Ubuntu 9.6.11-1.pgdg16.04+1), compiled by gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609, 64-bit
(1 …Run Code Online (Sandbox Code Playgroud) bash 的最大有符号整数值似乎是 9223372036854775807 (2^63)-1。bash 有没有办法处理比这更大的值?我需要处理最大 10000000000000000000000000001 的数字,但我不确定如何在 bash 中完成此操作。
A=10000000000000000000000000000
echo $A
10000000000000000000000000000
let A+=1
echo $A
4477988020393345025
Run Code Online (Sandbox Code Playgroud)
编辑 感谢本杰明·W.的评论。基于此,我正在尝试以下策略。这是否存在任何明显的问题?这意味着,除了由于调用 bc 造成的一些性能损失之外,使用 bc 增加我的变量是否会带来复杂性?
A=10000000000000000000000000000
echo $A
10000000000000000000000000000
A=$(bc <<< "$A+1")
echo $A
10000000000000000000000000001
Run Code Online (Sandbox Code Playgroud)
另外,我测试了一些 bash 操作(大于、小于等),看起来它的行为符合预期。例如:
A=10000000000000000000000000000
echo $A
10000000000000000000000000000
[[ "$A" -gt 10000000000000000000000000000 ]] && echo "A is bigger than 10000000000000000000000000000"
A=$(bc <<< "$A+1")
echo $A
10000000000000000000000000001
[[ "$A" -gt 10000000000000000000000000000 ]] && echo "A is bigger than 10000000000000000000000000000"
A is bigger than 10000000000000000000000000000
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一些POD文档并使用perldoc来显示它.我的目标是让格式看起来像这样:
REQUIRED ARGUMENTS
argument1
Description of the first argument.
argmuent2
Description of the second argument.
Run Code Online (Sandbox Code Playgroud)
其中"REQUIRED ARGUMENTS"是粗体标题,"argument1"和"argument2"是斜体.
但我无法弄清楚如何获得特定的缩进.
我试过这个:
=head1 REQUIRED ARGUMENTS
I<argument1>
Description of the first argument.
I<argument2>
Description of the second argument.
Run Code Online (Sandbox Code Playgroud)
产生以下内容(正确显示粗体标题和斜体,但不需要运行描述):
REQUIRED ARGUMENTS
argument1 Description of the first argument.
argument2 Description of the second argument.
Run Code Online (Sandbox Code Playgroud)
我试过了:
=head1 REQUIRED ARGUMENTS
I<argument1>
Description of the first argument.
I<argument2>
Description of the second argument.
Run Code Online (Sandbox Code Playgroud)
产生以下内容(粗体和斜体也很好,但现在参数和描述之间有一条额外的线):
REQUIRED ARGUMENTS
argument1
Description of the first argument.
argument2
Description of the second argument. …Run Code Online (Sandbox Code Playgroud) bash ×4
arguments ×1
awk ×1
configmap ×1
configparser ×1
cp ×1
default ×1
delimiter ×1
exec ×1
file ×1
find ×1
kubernetes ×1
largenumber ×1
perl ×1
postgresql ×1
python ×1
replication ×1
strftime ×1
timestamp ×1
xargs ×1