首页 > 解决方案 > Bash,awk,一列的两个参数

问题描述

一列需要awk 命令中的 2 个参数。

脚本,名称todo

#!/bin/bash

folder_main="$( cd $( dirname "${BASH_SOURCE[0]}" ) >/dev/null 2>&1 && pwd )"

if [ $1 = 'e' ]; then
    mcedit $folder_main/kb/todo.kb
else
    awk -F ',' '$1=="'$1'"' $folder_main/kb/todo.kb
fi

期望是当我写的时候,它会用ORtodo i将我的行与第一列除以.ic,

我试过这个。

    awk -F ',' '$1=="{c|'$1'}"' $folder_main/kb/todo.kb

但什么都没有。

谢谢。

标签: bashawk

解决方案


-v您应该使用并修复您的 awk 语法将您的 shell 变量传递给 awk :

awk -F, -v a="$1" '$1 == "c" || $1 == a' "$folder_main/kb/todo.kb"

这会将 awk 变量设置a为 shell 位置参数的值,$1如果第一列是“c”或者您作为第一个参数传递给脚本的任何内容,则打印该行。

您还可以通过使用正则表达式匹配而不是两个来稍微缩短行==

awk -F, -v a="$1" '$1 ~ "^(c|"a")$"' "$folder_main/kb/todo.kb"

虽然我个人认为第一个选项更容易阅读。使用它也更安全,因为在正则表达式中具有特殊含义的字符(例如*[或)可能会导致脚本失败({以意外方式运行。


推荐阅读