为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/中,斜杠是语法位