我有一个配置文件,其内容如下所示:
Jobname|Type|Silo|Description
#comment1
#comment2
job1|me|silo1|test_job1
job1|me|silo1|test_job2
job1|prod|silo1|test_job3
现在我需要文件的条件内容,例如 TYPE =me 的内容。为此,我使用 grep :
job_detail=$((cat config_file | grep me | awk '{print $4}'))
在这种情况下,我也得到了第一行,因为 JOBNAME 得到了匹配的字符 me。我用 -v 选项转义了注释。我无法评论配置文件的第一行,因为它被其他未知进程使用。
有没有办法可以 grep 整个单词匹配?如果有一种方法可以用特定字符作为条件来 grep 整个单词,那就更好了。
一种用“|”分隔行的方法然后 grep ?
答案1
尝试
awk -F\| -v select="$var" '$2 == select { print $4;}' config_file
在哪里
$var
包含您要选择的字段- -F\|告诉 awk 使用 |作为分隔符,| (pipr) 必须转义。
- -v select="$var" 将 $var 传输到 awk 变量(选择)
$2 == select
选择第二个参数为“$var”的行或选择。{ print $4;}
打印第四个字段。
答案2
man grep
会向您显示-w
标志:
-w, --word-regexp Select only those lines containing matches that form whole words. The test is that the matching substring must either be at the beginning of the line, or preceded by a non-word constituent character. Similarly, it must be either at the end of the line or followed by a non-word constituent character. Word-constituent characters are letters, digits, and the underscore.
或者,| egrep -v Jobname
尽早加入您的管道。
答案3
的一个变体阿彻玛的解决方案假设me
您要搜索的 是$LOGNAME
,即当前用户的用户名:
awk -F '|' '$2 == ENVIRON["LOGNAME"] { print $4 }' <config_file
这会将第二个|
- 分隔字段与 中的字符串进行比较$LOGNAME
,如果匹配,则打印第四个字段。
还明确忽略注释掉的行:
awk -F '|' '$1 ~ /^#/ { next } $2 == ENVIRON["LOGNAME"] { print $4 }' <config_file
答案4
我总是更喜欢 awk:
awk -F"|" '{ if ($2~/me/) { print $4 } }' myfile.txt