条件 grep

条件 grep

我有一个配置文件,其内容如下所示:

    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

相关内容