注意:已更新以显示所需图案的完整匹配;如果目标是为了显示部分匹配然后替换搜索模式相应地:
partial matching: $3 ~ /122e345a/
$1 ~ /abc/
complete matching: $3 == "122e345a"
$1 == "abc"
假设:
- 第一搜索由寻找一个线,其中所述第三字段是一个完整的匹配对于字符串
"122e345a"
,并且如果找到,则...
- 查找一行,其中第一个字段与字符串完全匹配,并且如果找到,则...
- 打印第二字段的内容
- 字符串
"122e345a"
首先出现在文件中(包含字符串行)中,用表示了串或者a)在同一行中为第一串或b )在随后的线
- 如果字符串多次显示出来在一个文件中(串
"122e345a"
被发现之后),则串每次出现将导致发出的命令print
一个可能awk
溶液:
awk '
BEGIN { found = 0 }
$3 == "122e345a" { found = 1 }
(found == 1) && $1 == "abc" { print $2 }
' <file>
- 设置可变
found=0
;因为这是BEGIN
块它只是在处理新的文件开始执行的部分(即,我们正在初始化found
)
- 如果字符串
"122e345a"
在一条线上的第3场被发现然后设置found = 1
- 如果我们的变量
found
设置为1
,和字符串在一条线上的第一场被发现,然后打印该行的第二场
注意:您可以提交awk脚本作为多线构建(上图)或作为单一线,例如:
awk 'BEGIN { found = 0 } $3 == "122e345a" { found = 1 } (found == 1) && $1 == "abc" { print $2 }' <file>
使用示例文件(file1/file2/file3
),并加入file4
为file1
与线副本切换:
$ cat file4
abc 25b57790c
text xyz 122e345a rxyc
$ for f in file*
do
echo "++++++++++++++ file : $f"
awk 'BEGIN { found = 0 } $3 == "122e345a" { found = 1 } (found == 1) && $1 == "abc" { print $2 }' $f
done
++++++++++++++ file : file1
25b57790c
++++++++++++++ file : file2
++++++++++++++ file : file3
++++++++++++++ file : file4
注意到,虽然file4
具有同时匹配搜索字符串线,串"122e345a"
显示出来后字符串,这违背了其中一个假设,所以file4
未能通过我们的搜索。
一个优秀的第一Q.保持张贴! (但是*在每行代码/数据/错误消息的前面使用4个空格,或者突出显示一段文本,并使用编辑框左上角的格式化工具将代码/数据/输出格式化*。祝你好运 – shellter
“模式”这个词是不明确的,应该避免,为了澄清你的问题 - 无论它出现在什么地方,用“字符串”或“正则表达式”替换“模式” ,并说明匹配应该是完整的还是部分的,它从你的脚本中看到,比如你想要做的是在完整的字符串上进行字符串匹配,但是我们不能确定你想从脚本中得到什么,你现在有2个答案 - 一个使用完整的字符串匹配和另一个部分正则表达式匹配,所以它可以节省时间,如果你只是说明你真正需要的。 –