bash - 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
将我的行与第一列除以.i
c
,
我试过这个。
awk -F ',' '$1=="{c|'$1'}"' $folder_main/kb/todo.kb
但什么都没有。
谢谢。
解决方案
-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"
虽然我个人认为第一个选项更容易阅读。使用它也更安全,因为在正则表达式中具有特殊含义的字符(例如*
、[
或)可能会导致脚本失败(
或{
以意外方式运行。
推荐阅读
- c - C函数自动连接char数组参数
- php - 我如何在这里成功使用函数 array_intersect() ?
- javascript - 如何遍历数据库中的字段并找到空字段
- python - 禁止(CSRF 令牌丢失或不正确。):Django 表单
- java - 在两个列表中查找所有常见元素
- html - 中心文本仅适用于简短的展开行?
- batch-file - 无法弄清楚为什么程序在我的脚本中的某个部分无法运行
- java - 如何使用 neo4j java driver 4.0.0 批量流式传输记录?
- c++ - LLVM 查找在堆上运行的加载/存储指令
- r - R - 如何以编程方式从数据框中过滤数据