【问题标题】:how to search for a value stored in variable from a file using awk/ grep如何使用 awk/grep 从文件中搜索存储在变量中的值
【发布时间】:2020-06-21 00:39:28
【问题描述】:

这可能是微不足道的,但我在将 awk 用于简单目的时遇到问题,例如使用 tcl 脚本在文件中打印行。 我有变量 var :

set var manager

源文件.txt:

ajay manager account 45000
sunil clerk account 25000
varun manager sales 50000
amit manager account 47000
tarun peon sales 15000
deepak clerk sales 23000
sunil peon sales 13000
satvik director purchase 80000

我想将命令放入 tcl 脚本 (awk/grep) 中,该脚本使用变量 var 在源文件中搜索字符串,然后打印包含该字符串的行的第 4 列。 我不想直接搜索经理,而是使用 var 。 我用过:

awk -v pat="$var"  {$2 ~ pat {print $4 }} sorcefile.txt

但它给了我错误提示

awk: 'pat' argument to '-v' not in var=value form

也在 tcl 脚本中:

awk '/manager/ {print $4}' sourcefile.txt

给出错误,并且

awk {/manager/ {print $4}} sourcefile.txt

效果很好 所以,需要的输出:

45000
50000
47000

我需要把命令放到一个文件里面,然后执行这个文件。

【问题讨论】:

  • 哪个错误? awk ... { $2 ~ pat {print $4 }} 是什么语法?请使用 shellcheck.net 解决明显的问题。
  • 先生,这不起作用;显示无法读取文件 pat
  • 它显示的 () 位置不正确

标签: awk grep tcl


【解决方案1】:

这是引号的位置。

$ tclsh
% set var manager
manager
+% exec awk -v pat="$var" {$2 ~ pat {print $4}} sourcefile.txt

没有输出。让我们让shell echo awk 命令而不是执行它:

% exec echo awk -v pat="$var" {$2 == pat {print $4}} sourcefile.txt
awk -v pat="manager" $2 == pat {print $4} sourcefile.txt

注意双引号如何成为那里的模式的一部分?

让我们把双引号移动一下:

% exec echo awk -v "pat=$var" {$2 == pat {print $4}} sourcefile.txt
awk -v pat=manager $2 == pat {print $4} sourcefile.txt

注意引号是怎么消失的?让我们现在执行它:

% exec awk -v "pat=$var" {$2 == pat {print $4}} sourcefile.txt
45000
50000
47000

这与Tcl rule for double quotes 相关——开头的引号必须是单词的第一个字符

在第一种情况下,awk pat 变量的字面意思是 "manager",并且由于没有 $2 值包含引号,因此不会发生匹配。

【讨论】:

  • 但是“'-v' 的参数不是 var=value 形式”错误来自哪里?他们最终需要运行awk -v pat blahblah... 才能得到它。或者 TCL 在某些情况下也会吃等号吗?
  • 我不完全相信这个问题包含所有细节。
【解决方案2】:

这可以简单地在 tcl 中完成

set var ...
set fi [ open "file.txt" ]
set lines [split [read $fi] "\n"]
close $fi
foreach line $lines {
        set la [ split $line ]
        if { [ lindex $la 1 ] eq $var  } {
                puts [ lindex $la 3 ]
        }

}

注意列表索引从 0 开始,awk 的 $4' 是 tcl [lindex $la 3]

【讨论】:

  • 我使用了您的建议,但我不知道为什么它会显示意外错误:-> 设置:变量名称应以字母开头。我不知道为什么它会显示这样的错误
  • 您是否将... 替换为实际值?
  • 该错误消息听起来像是您没有在 tcl shell 中运行它。变量名几乎可以是 Tcl 中的任何东西,包括空字符串。所以它永远不会告诉你名字应该以字母开头。
猜你喜欢
  • 2015-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-01
  • 1970-01-01
  • 2016-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多