Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为IF语句将shell变量传递给AWK_Shell_Variables_If Statement_Awk - Fatal编程技术网

为IF语句将shell变量传递给AWK

为IF语句将shell变量传递给AWK,shell,variables,if-statement,awk,Shell,Variables,If Statement,Awk,这就是我想打破我的头。。。但它仍然不起作用 这就是工作原理: awk '{ if ( $2 ~ /FULL/ ) print "TRUE" $0 }' FILE1 但是现在我想让“/FULL/”部分动态,所以我可以通过将它链接到shell变量来更改它 这就是我想要的: shellfull="/FULL/" awk -v awkfull=$shellfull '{ if ( $2 ~ awkfull ) print "TRUE" $0

这就是我想打破我的头。。。但它仍然不起作用

这就是工作原理:

awk '{
    if ( $2 ~ /FULL/ )
     print "TRUE" $0
   }' FILE1
但是现在我想让“/FULL/”部分动态,所以我可以通过将它链接到shell变量来更改它

这就是我想要的:

shellfull="/FULL/"

awk -v awkfull=$shellfull '{
    if ( $2 ~ awkfull )
    print "TRUE" $0
                            }' FILE1
其中FILE1包含以下内容:

84738273 RTF-Ref-FULL-Monday 
38473847 The-Wed-DLL-DIFF-Fri-FULL 
84839489 FULL 
83945940 Schedule_FULL 
84928049 Schedule_DIFF 
它似乎不允许我在“IF”语句中使用awkfull,因为我可以打印awkfull,它确实显示了shell变量的内容。 我的意思是:

print awkfull       //this works)
if ( $1 ~ awkfull)  //this does NOT work... why?
更新1

对于所有的回答,有些人给出了非常好的想法。但我觉得我需要描述我的确切情况。因为我真的需要“/”来在字符串中重新命名的位置上找到一个单词,而且我不知道字符串会是什么样子

因此,以下是我想使用它的目的:

//Set Variable Content:
FULL="/FULL/||/Full/||/full/||/SQL-Backup_Fri-Last-Of-Month/"
DIFF="/DIFF/||/Diff/||/diff/||/San-Element/"
现在我有了一个大的日志文件,它的一个字符串中有一些单词,我将使用它们来确定它是算作FULL还是DIFF,或者两者都算作FULL,根据$FULL或$DIFF中是否有一个单词与该字符串中的重新命名位置相匹配

因此,如果文件中的stings如下所示:

84738273 RTF-Ref-full-Monday 
38473847 The-Wed-DLL-DIFF-Fri-FULL 
84839489 FULL 
83945940 Schedule_Full_backup 
84928049 Schedule_DIFF
83940392 2_SQL-Backup_Fri-Last-Of-Month-23049
84828348 Schedule_new-build
awk -v patt=$shellfull 'BEGIN{split(patt,a,"|")} 
  {for (i in a) if ($2==a[i]) {print "TRUE " $0; next}}' a
我希望它成为:

FULL 84738273 RTF-Ref-full-Monday 
DIFFFULL 38473847 The-Wed-DLL-DIFF-Fri-FULL 
FULL 84839489 FULL 
FULL 83945940 Schedule_Full 
DIFF 84928049 Schedule_DIFF
FULL 83940392 2_SQL-Backup_Fri-Last-Of-Month-23049
UNKNOWN 84828348 Schedule_new-build
现在,重要的是要有一个单词列表,它将以动态方式搜索设置。因此,通过更改变量$DIFF或$FULL,它将在文件中搜索不同的单词

因此,我希望通过sript概念实现这一点:

//set filter patterns
FULL="/FULL/||/Full/||/full/||/SQL-Backup_Fri-Last-Of-Month/"
DIFF="/DIFF/||/Diff/||/diff/||/San-Element/" 

awk -v full=$FULL -v diff=$DIFF '{          //link the shell variable to awk variable, since a direct shell variable in awk didn't work.
if ( $2 ~ diff )                            //find all strings with words defined in $DIFF
print "DIFF" $0                             //print "DIFF" in front of the line
if ( $2 ~ full )                            //find all strings with words defined in $FULL
print "FULL" $0                             //print "FULL" in front of the line
if ( $2 !~ full||diff)                      //if a line does neighter contain words of $DIFF or $FULL.
print "UNKNOWN" $0                          //print "UNKNOWN" in front of the line
                        }' FILE1            //load the file that needs to be filterd
如果这个脚本发现了尚未定义的计划和策略,那么它需要向我和它自己说明。这样scipt就可以知道何时创建了新的未知计划或策略,并可以警告我需要调整其过滤器。它使脚本能够计算出计算出的千字节将有多少放入“未知计划和策略池”


希望这能让事情变得更清楚一点。我需要在字符串中的重新命名位置搜索多个重新命名单词[FULL,FULL,SQL-DB,etc.],这就是为什么我想使用/$FULL/| |/$diff/,或者类似的东西]。

您的字符串不需要使用
/
进行比较。它在以下情况下工作:

shellfull="FULL"
测验
使现代化 根据您刚刚发布的输入文件:

$ shellfull="FULL"
$ awk -v patt=$shellfull '$2 ~ patt {print "TRUE " $0}' a
TRUE 84738273 RTF-Ref-FULL-Monday 
TRUE 38473847 The-Wed-DLL-DIFF-Fri-FULL 
TRUE 84839489 FULL 
TRUE 83945940 Schedule_FULL
如果您想要精确匹配:

$ awk -v patt=$shellfull '$2==patt {print "TRUE " $0}' a
TRUE 84839489 FULL 

更新2 如果要匹配通过字符串传递的不同单词,请执行以下操作:

84738273 RTF-Ref-full-Monday 
38473847 The-Wed-DLL-DIFF-Fri-FULL 
84839489 FULL 
83945940 Schedule_Full_backup 
84928049 Schedule_DIFF
83940392 2_SQL-Backup_Fri-Last-Of-Month-23049
84828348 Schedule_new-build
awk -v patt=$shellfull 'BEGIN{split(patt,a,"|")} 
  {for (i in a) if ($2==a[i]) {print "TRUE " $0; next}}' a
它获取字符串,用分隔符分解它(您可以定义另一个),然后查找每个给定字符串的精确匹配

测验
您的字符串不需要使用
/
进行比较。它在以下情况下工作:

shellfull="FULL"
测验
使现代化 根据您刚刚发布的输入文件:

$ shellfull="FULL"
$ awk -v patt=$shellfull '$2 ~ patt {print "TRUE " $0}' a
TRUE 84738273 RTF-Ref-FULL-Monday 
TRUE 38473847 The-Wed-DLL-DIFF-Fri-FULL 
TRUE 84839489 FULL 
TRUE 83945940 Schedule_FULL
如果您想要精确匹配:

$ awk -v patt=$shellfull '$2==patt {print "TRUE " $0}' a
TRUE 84839489 FULL 

更新2 如果要匹配通过字符串传递的不同单词,请执行以下操作:

84738273 RTF-Ref-full-Monday 
38473847 The-Wed-DLL-DIFF-Fri-FULL 
84839489 FULL 
83945940 Schedule_Full_backup 
84928049 Schedule_DIFF
83940392 2_SQL-Backup_Fri-Last-Of-Month-23049
84828348 Schedule_new-build
awk -v patt=$shellfull 'BEGIN{split(patt,a,"|")} 
  {for (i in a) if ($2==a[i]) {print "TRUE " $0; next}}' a
它获取字符串,用分隔符分解它(您可以定义另一个),然后查找每个给定字符串的精确匹配

测验
您只需使用以下工具即可:

shellfull="/FULL/"

awk '{
     if ( $1 ~ '$shellfull' )
     print "TRUE" $0
}' FILE1

这看起来像是在引用
$shellfull
变量,但实际上是在“取消引用”它,以便shell查看它。

您只需使用:

shellfull="/FULL/"

awk '{
     if ( $1 ~ '$shellfull' )
     print "TRUE" $0
}' FILE1

这看起来像是在引用
$shellfull
变量,但实际上是在“取消引用”它,以便shell查看它。

根据您的最新更新,听起来您只需要:

$ FULL="FULL|Full|full|SQL-Backup_Fri-Last-Of-Month"
$ DIFF="DIFF|Diff|diff|San-Element"

$ cat file
84738273 RTF-Ref-full-Monday 
38473847 The-Wed-DLL-DIFF-Fri-FULL 
84839489 FULL 
83945940 Schedule_Full_backup 
84928049 Schedule_DIFF
83940392 2_SQL-Backup_Fri-Last-Of-Month-23049
84828348 Schedule_new-build

$ awk -v full="$FULL" -v diff="$DIFF" '{
    if ( ( $2 ~ diff ) && ( $2 ~ full ) )
        print "DIFFFULL", $0
    else if ( $2 ~ diff )
        print "DIFF", $0
    else if ( $2 ~ full )
        print "FULL", $0
    else
        print "UNKNOWN", $0
}' file
FULL 84738273 RTF-Ref-full-Monday 
DIFFFULL 38473847 The-Wed-DLL-DIFF-Fri-FULL 
FULL 84839489 FULL 
FULL 83945940 Schedule_Full_backup 
DIFF 84928049 Schedule_DIFF
FULL 83940392 2_SQL-Backup_Fri-Last-Of-Month-23049
UNKNOWN 84828348 Schedule_new-build

但如果出现“Diff”这样的词,您需要决定是否可以将其与“Diff”匹配。

根据您的最新更新,您所需要的似乎是:

$ FULL="FULL|Full|full|SQL-Backup_Fri-Last-Of-Month"
$ DIFF="DIFF|Diff|diff|San-Element"

$ cat file
84738273 RTF-Ref-full-Monday 
38473847 The-Wed-DLL-DIFF-Fri-FULL 
84839489 FULL 
83945940 Schedule_Full_backup 
84928049 Schedule_DIFF
83940392 2_SQL-Backup_Fri-Last-Of-Month-23049
84828348 Schedule_new-build

$ awk -v full="$FULL" -v diff="$DIFF" '{
    if ( ( $2 ~ diff ) && ( $2 ~ full ) )
        print "DIFFFULL", $0
    else if ( $2 ~ diff )
        print "DIFF", $0
    else if ( $2 ~ full )
        print "FULL", $0
    else
        print "UNKNOWN", $0
}' file
FULL 84738273 RTF-Ref-full-Monday 
DIFFFULL 38473847 The-Wed-DLL-DIFF-Fri-FULL 
FULL 84839489 FULL 
FULL 83945940 Schedule_Full_backup 
DIFF 84928049 Schedule_DIFF
FULL 83940392 2_SQL-Backup_Fri-Last-Of-Month-23049
UNKNOWN 84828348 Schedule_new-build

但您需要确定,如果出现“Diff”这样的词,那么“Different”与“Diff”匹配是否合适。

运行以下命令时出错:

Spacedata_1
是一个文件
mountpoint
是具有某些值的外部变量

grep "$mountpoint" Spacedata_1 |awk -v mountpoint=$mountpoint 'if ($5==mountpoint ) { print $4 }'

运行以下命令时出错:

Spacedata_1
是一个文件
mountpoint
是具有某些值的外部变量

grep "$mountpoint" Spacedata_1 |awk -v mountpoint=$mountpoint 'if ($5==mountpoint ) { print $4 }'

我需要有/因为在真实的文件中,该文件将包含以下内容:84738273 RTF Ref FULL MONAY 38473847 Wed DLL DIFF Fri FULL 84839489 FULL 83945940_FULL@AcEKrystal请更新显示文件内容的帖子。在注释中,我们正在丢失格式,因此不清楚它是什么样子。我认为OP不希望出现假阳性,所以如果字段是固定的,请使用边界匹配、锚定或更好的字符串比较。@AcEKrystal您应该能够在shell变量中放入符合您需要的正则表达式。我相信
awk
会将其作为正则表达式,即使它没有
/
分隔符。字段不是固定的。。那是我的问题。。然后又来了。。我想比较的总数是“/FULL/| | | |/FULL/| | | SQL backup dump/”我需要有/因为在实际文件中,该文件将包含以下内容:84738273 RTF Ref FULL Monday 38473847 Wed DLL DIFF Fri FULL 84839489 FULL 83945940_FULL@AcEKrystal请更新显示文件内容的帖子。在注释中,我们正在丢失格式,因此不清楚它是什么样子。我认为OP不希望出现假阳性,所以如果字段是固定的,请使用边界匹配、锚定或更好的字符串比较。@AcEKrystal您应该能够在shell变量中放入符合您需要的正则表达式。我相信
awk
会将其作为正则表达式,即使它没有
/
分隔符。字段不是固定的。。那是我的问题。。然后又来了。。我想比较的总数是“/FULL/| | |/FULL/| | | SQL backup dump/”,答案已经公布,但让我添加它作为注释:/regex/是一个正则表达式常量;“字符串”是字符串;and~将rhs作为正则表达式,根据需要将字符串转换为正则表达式。所以在/regex/中,斜杠是语法位