我有一些文件:
file1.csv
file2.csv
file3.csv
Run Code Online (Sandbox Code Playgroud)
给定的脚本处理它们,并记录到此文件:
my.log
Run Code Online (Sandbox Code Playgroud)
采用这种格式:( filename col2 col3):
file1.csv 1 a
file2.csv 1 a
file3.csv 1 a
file2.csv 2 b
file1.csv 2 b
file3.csv 2 b
file1.csv 3 c
file2.csv 3 c
file3.csv 3 c
file2.csv 4 d
file3.csv 4 d
Run Code Online (Sandbox Code Playgroud)
我想从每个文件的文件中获取一个col3值(仅最后一个)。my.log*.csv
我运行这个命令:
ls *.csv | xargs -I@ bash -c "cat my.log | grep @ | tail -n 1 | awk '{ print $3 }'"
Run Code Online (Sandbox Code Playgroud)
它工作得很好,除了 awk 给了我所有的列。
file1.csv 3 c
file2.csv 4 d
file3.csv 4 d
Run Code Online (Sandbox Code Playgroud)
我怎样才能只得到col3一列?例如,这个:
c
d
d
Run Code Online (Sandbox Code Playgroud)
在你的表情里
"cat my.log | grep @ | tail -n 1 | awk '{ print $3 }'"
Run Code Online (Sandbox Code Playgroud)
...该字符串周围的双引号意味着单引号被视为文字。它们不保护$3外壳,因此它被扩展为环境变量。由于$3实际上并未由 shell 定义(除非这是在您使用 3 个参数调用的脚本中),因此它变成空字符串,并且表达式awk很简单{ print },打印整行。
您可以通过转义来解决此问题$:
ls *.csv | xargs -I@ bash -c "cat my.log | grep @|tail -n 1|awk '{print \$3}'"
Run Code Online (Sandbox Code Playgroud)
...或者通过将awk表达式移出xargs:
ls *.csv | xargs -I@ bash -c "cat my.log | grep @|tail -n 1"|awk '{print $3}'
Run Code Online (Sandbox Code Playgroud)