我有一个非常简单的脚本,如下所示:
#!/bin/bash
VAR1="$1"
MOREF='sudo run command against $VAR1 | grep name | cut -c7-'
echo $MOREF
Run Code Online (Sandbox Code Playgroud)
当我从命令行运行此脚本并将参数传递给它时,我没有得到任何输出.但是,当我运行$MOREF变量中包含的命令时,我能够获得输出.
我想知道如何获取需要在脚本中运行的命令的结果,将其保存到变量,然后在屏幕上输出该变量?
如果我有一个csv文件,是否有快速bash方式打印出任何单个列的内容?可以安全地假设每行具有相同的列数,但每列的内容将具有不同的长度.
这可能是许多常见问题解答 - 而不是使用:
cat file | command
Run Code Online (Sandbox Code Playgroud)
(这被称为无用的猫),正确的方式应该是:
command < file
Run Code Online (Sandbox Code Playgroud)
在第二,"正确"的方式 - 操作系统不必产生额外的过程.
尽管知道这一点,我继续使用无用的猫有两个原因.
更美观 - 我喜欢数据仅从左到右均匀移动.而且它更容易更换cat别的东西(gzcat,echo,...),添加第二个文件或插入新的过滤器(pv,mbuffer,grep...).
我"觉得"在某些情况下可能会更快.更快,因为有2个进程,1st(cat)执行读取而第二个执行任何操作.它们可以并行运行,这意味着有时可以更快地执行.
我的逻辑是否正确(第二个原因)?
给定一个包含这样数据的文件(即stores.dat文件)
sid|storeNo|latitude|longitude
2|1|-28.03720000|153.42921670
9|2|-33.85090000|151.03274200
Run Code Online (Sandbox Code Playgroud)
输出列名数的命令是什么?
即在上面的示例中它将是4.(管道字符数+第一行中的1)
我想的是:
awk '{ FS = "|" } ; { print NF}' stores.dat
Run Code Online (Sandbox Code Playgroud)
但它返回所有行而不是第一行,而第一行则返回1而不是4
这个问题的目的是提供一个规范的答案.
给定可能由Excel或其他具有嵌入换行符的工具生成的CSV,嵌入式双引号和空字段,如:
$ cat file.csv
"rec1, fld1",,"rec1"",""fld3.1
"",
fld3.2","rec1
fld4"
"rec2, fld1.1
fld1.2","rec2 fld2.1""fld2.2""fld2.3","",rec2 fld4
Run Code Online (Sandbox Code Playgroud)
使用awk识别单独记录和字段的最有效方法是什么:
Record 1:
$1=<rec1, fld1>
$2=<>
$3=<rec1","fld3.1
",
fld3.2>
$4=<rec1
fld4>
----
Record 2:
$1=<rec2, fld1.1
fld1.2>
$2=<rec2 fld2.1"fld2.2"fld2.3>
$3=<>
$4=<rec2 fld4>
----
Run Code Online (Sandbox Code Playgroud)
所以它可以在awk脚本的其余部分内部用作那些记录和字段.
有效的CSV将符合RFC 4180或可由MS-Excel生成.
解决方案必须允许记录结束只是LF(\n),这是UNIX文件的典型情况,而不是CRLF(\r\n),正如标准所要求的那样,Excel或其他Windows工具会生成.它还可以容忍与引用字段混合的未加引号的字段.它特别不需要容忍"使用前面的反斜杠转义s(即\"代替""),因为其他一些CSV格式允许 - 如果你有,那么添加一个gsub(/\\"/,"\"\"")前端将处理它并尝试在一个脚本中自动处理两个转义机制将使脚本不必要地脆弱和复杂.
如果您有这样的csv数据集:
name, age, gender
john, 20, male
jane, 30, female
bob, 25, male
Run Code Online (Sandbox Code Playgroud)
你能说到这个:
[ {"name": "john", "age": 20, "gender: "male"},
{"name": "jane", "age": 30, "gender: "female"},
{"name": "bob", "age": 25, "gender: "male"} ]
Run Code Online (Sandbox Code Playgroud)
仅使用jq?
我发现这篇文章展示了我正在尝试做的事情,但它使用标题字段的"手动"映射到值.我不需要/想要重命名标题字段并且有相当多的字段.我也不想每次布局更改时都要更改脚本/命令.
是否可以动态提取标题,然后使用jq one-liner将它们与值组合?
假设我有以下csv文件:
id,message,time
123,"Sorry, This message
has commas and newlines",2016-03-28T20:26:39
456,"It makes the problem non-trivial",2016-03-28T20:26:41
Run Code Online (Sandbox Code Playgroud)
我想编写一个只返回时间列的bash命令.即
time
2016-03-28T20:26:39
2016-03-28T20:26:41
Run Code Online (Sandbox Code Playgroud)
最直接的方法是什么?您可以假设标准unix工具的可用性,例如awk,gawk,cut,grep等.
注意存在的"逃逸",以及用于进行琐碎尝试的换行符
cut -d , -f 3 file.csv
Run Code Online (Sandbox Code Playgroud)
徒劳的.
好吧,所以我有一个用户和密码的CSV文件,密码有时包含反斜杠,我需要循环这个文件并将用户和密码传递给另一个脚本,但我无法弄清楚如何使bash取反斜杠作为文字角色.
csv:
jgalley@debian1mig:~/logs/zimbraShares$ cat test.csv
user3@domain.com,bzfbx6bkuu\Mpull
user2@domain.com,Hppk8mll\kffbsfd
user1@domain.com,w1fgfqbjlhLjnni\
Run Code Online (Sandbox Code Playgroud)
Sed没有扩展反斜杠 - 这很好:
jgalley@debian1mig:~/logs/zimbraShares$ cat test.csv | sed "s/,/\t/"
user3@domain.com bzfbx6bkuu\Mpull
user2@domain.com Hppk8mll\kffbsfd
user1@domain.com w1fgfqbjlhLjnni\
Run Code Online (Sandbox Code Playgroud)
尝试将它们读入变量会导致反斜杠成为元字符,如您所见,它会转义字符并导致最后一行转义返回字符,因为它在结尾处:
jgalley@debian1mig:~/logs/zimbraShares$ cat test.csv | sed "s/,/\t/" | while read user pass; do echo "${user},${pass}"; done
user3@domain.com,bzfbx6bkuuMpull
user2@domain.com,Hppk8mllkffbsfd
Run Code Online (Sandbox Code Playgroud)
试图首先逃避反斜杠也不起作用:
jgalley@debian1mig:~/logs/zimbraShares$ cat test.csv | sed "s/,/\t/" | sed "s/\\\/\\\\/g" | while read user pass; do echo "${user},${pass}"; done
user3@domain.com,bzfbx6bkuuMpull
user2@domain.com,Hppk8mllkffbsfd
jgalley@hoth1mig:~/logs/zimbraShares$
Run Code Online (Sandbox Code Playgroud)
最终目标是做这样的事情:
head test.csv | sed "s/,/\t/g" | while read auser apass;
do
echo -n "${auser},${apass}"
bash -c …Run Code Online (Sandbox Code Playgroud)