这是我原来的命令行:
awk 'FNR==NR{a[$2]=$1;next}($2 in a){if(a[$2]!=$1)print $2}' file1 file2
Run Code Online (Sandbox Code Playgroud)
它位于 bash 脚本中,我最初将每个部分输出到一个文件,然后在下一行我使用该文件作为输入。但是,现在我正在切换到使用变量,并且我已经深入到这一行并且由于双重输入而卡住了。
所以我不再试图将文件提供给 awk,我想要提供变量。
如果我正在处理一个变量,我知道我会这样做:
echo "$var1" | awk '{$1=$2=""; print $0}'
Run Code Online (Sandbox Code Playgroud)
但是我找不到如何在 bash 脚本中将第二个变量/流传递到 awk 的示例。
我试过的例子:
awk 'FNR==NR{a[$2]=$1;next}($2 in a){if(a[$2]!=$1)print $2}' "$var1" "$var2"
echo "${var1}" | awk 'FNR==NR{a[$2]=$1;next}($2 in a){if(a[$2]!=$1)print $2}' "${var2}"
awk -v s1="$var1" -v s2="$var2" 'FNR==NR{a[$2]=$1;next}($2 in a){if(a[$2]!=$1)print $2}' "$s1" "$s2"
Run Code Online (Sandbox Code Playgroud)
编辑:
对于某些背景,这是一个非常简化的版本,但我有一组类似这样的文件:
:~/test$ ls -lR ?/file*
-rw-rw-r-- 1 madivad madivad 11 Apr 19 23:17 1/file.0
-rw-rw-r-- 1 madivad madivad 6 Apr 19 23:04 1/file.1
-rw-rw-r-- 1 madivad madivad 8 Apr 19 23:04 1/file.2
-rw-rw-r-- 1 madivad madivad 8 Apr 19 23:04 1/file.3
-rw-rw-r-- 1 madivad madivad 6 Apr 19 23:05 2/file.1
-rw-rw-r-- 1 madivad madivad 10 Apr 19 23:06 2/file.3
-rw-rw-r-- 1 madivad madivad 6 Apr 19 23:05 2/file.4
-rw-rw-r-- 1 madivad madivad 11 Apr 19 23:17 2/file.5
Run Code Online (Sandbox Code Playgroud)
我还有两个审计文件,其中包含每个目录结构的散列结果,每个目录结构可以跨越很深,每个文件包含 500MB+ 的数据。
在命令行上,我编写了几个工具来查找欺骗、年龄和大小排序、查找丢失的文件等。我正在尝试使该过程更加自动化,并将其包含在批处理文件中。我实际上已经把它全部放在一个批处理文件中,并将硬盘用作临时位置,即,我将每个输出作为文件保存到硬盘驱动器,下一个批处理行加载该文件并继续。我的目标是摆脱所有多余的文件。
文件结构在标准hashdeep
输出中,但我已经对其进行了操作,使其仅包含一个固定的哈希字符串、几个空格以及文件的完整路径和文件名。它开始是这样的:
~/test$ head 2/audit?
==> 2/audit1 <==
%%%% HASHDEEP-1.0
%%%% size,md5,sha256,filename
## Invoked from: /home/madivad/test/1
## $ hashdeep -l file.0 file.1 file.2 file.3
##
11,3213c6d334141924ab1454f0349a0ccb,6f92601344e16851316e7cda90d053c0ad234e047ccf81ce6fe89e78bbdb111e,file.0
8,736e5da8b598eec84d4ec0e1be63b6d1,eeda2f21a9320e751d98a92ceb903bdf5e9e5b6f6ca3690fdc0fb67b70a5efb2,file.2
8,e487aeec573e0936c1ac9f091130c20b,1bbb337a707d059be503510600b59292bbc9b1a171fe2b0b07ec122bc2bbff4f,file.3
6,fa8f294721ab3fbb37793c68ff2cf09b,32c66107f0f4f2053128e519681fc8e88806d0d2b17607ce9f2362aff66ad6c7,file.1
==> 2/audit2 <==
%%%% HASHDEEP-1.0
%%%% size,md5,sha256,filename
## Invoked from: /home/madivad/test/2
## $ hashdeep -l file.1 file.3 file.4 file.5
##
11,3213c6d334141924ab1454f0349a0ccb,6f92601344e16851316e7cda90d053c0ad234e047ccf81ce6fe89e78bbdb111e,file.5
6,9e87b0fde0cf6b641bd4a27aee5f5536,247ed9d62df1b8b2da7dedf48b0795ef302d21811885180384c3f560c819d361,file.4
6,fa8f294721ab3fbb37793c68ff2cf09b,32c66107f0f4f2053128e519681fc8e88806d0d2b17607ce9f2362aff66ad6c7,file.1
10,b7b9e4419c0708f401d45f061ac9a231,fcfecc7079ad08912d7a0ebcb24816442067b101a0da0c252533b78e00c19c52,file.3
Run Code Online (Sandbox Code Playgroud)
当我开始awk
处理时,我已经有了这样的:
~/test$ head 2/so*
==> 2/sort1 <==
3213c6d334141924ab1454f0349a0ccb6f92601344e16851316e7cda90d053c0ad234e047ccf81ce6fe89e78bbdb111e file.0
736e5da8b598eec84d4ec0e1be63b6d1eeda2f21a9320e751d98a92ceb903bdf5e9e5b6f6ca3690fdc0fb67b70a5efb2 file.2
e487aeec573e0936c1ac9f091130c20b1bbb337a707d059be503510600b59292bbc9b1a171fe2b0b07ec122bc2bbff4f file.3
fa8f294721ab3fbb37793c68ff2cf09b32c66107f0f4f2053128e519681fc8e88806d0d2b17607ce9f2362aff66ad6c7 file.1
==> 2/sort2 <==
3213c6d334141924ab1454f0349a0ccb6f92601344e16851316e7cda90d053c0ad234e047ccf81ce6fe89e78bbdb111e file.5
b7b9e4419c0708f401d45f061ac9a231fcfecc7079ad08912d7a0ebcb24816442067b101a0da0c252533b78e00c19c52 file.3
9e87b0fde0cf6b641bd4a27aee5f5536247ed9d62df1b8b2da7dedf48b0795ef302d21811885180384c3f560c819d361 file.4
fa8f294721ab3fbb37793c68ff2cf09b32c66107f0f4f2053128e519681fc8e88806d0d2b17607ce9f2362aff66ad6c7 file.1
Run Code Online (Sandbox Code Playgroud)
对于我尝试按照此问题运行的特定行,我希望上述输入$2
仅在文件名出现在两个文件中时才输出文件名,但散列a[$2] and
$1` 不匹配。
因此,对于上述输入,我只希望看到:
file.3
Run Code Online (Sandbox Code Playgroud)
考虑到这些变量:
$ a=$'one\ntwo';echo "$a"
one
two
$ b=$'three\nfour';echo "$b"
three
four
Run Code Online (Sandbox Code Playgroud)
这些是一些可能的选择:
$ printf '%s\n%s\n' "$a" "$b" |awk '{print NR,$0}'
$ awk '{print NR,$0}' <(echo "$a") <(echo "$b") #process substitution as per Kusalananda's comment
$ echo "$a" |awk '{print NR,$0}' - <(echo "$b")
$ { echo "$a" && echo "$b";} |awk '{print NR,$0}' #or even { echo "$a";echo "$b";}
$ awk '{print NR,$0}' <(echo "$a";echo "$b")
$ awk '{print NR,$0}' <<<$(echo "$a";echo "$b")
Run Code Online (Sandbox Code Playgroud)
以上所有示例均产生:
1 one
2 two
3 three
4 four
Run Code Online (Sandbox Code Playgroud)
如果变量以新行结尾(即变量包含文件的内容),像这样的模式:
$ a=$'one\ntwo\n'
$ b=$'three\nfour\n'
Run Code Online (Sandbox Code Playgroud)
然后这也有效:
$ awk '{print NR,$0}' <<<"$a$b"
1 one
2 two
3 three
4 four
5
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8693 次 |
最近记录: |