【问题标题】:Doing an awk command for a conditional statement为条件语句执行 awk 命令
【发布时间】:2019-10-07 09:51:18
【问题描述】:

我正在使用 Awk 命令执行 bash 脚本来格式化包含一些用户信息的文件,并且在脚本的开头,我希望它说“如果第 1 列中的值不是格式 abc123,跳过那一行。但它似乎不起作用。

我以前有这个:

$1=="UID" || $1=="rslavin" {
  next
}

但这当然不适用于具有不同用户名的其他输入文件。

所以,这是我最近尝试过的:

$1!=([a-z]{3}[0-9]{3}) {

 next

}

输入文件如下所示:

1 UID PID PPID C STIME TTY TIME CMD
2 adz110 5344 5334 0 08:47 pts /2 00:00:00 bash
3 dmq292 6908 6854 0 Jun04 pts /1 00:00:00 bash
4 adz110 7227 7150 0 Jul11 pts /9 00:00:00 who
5 erg474 7466 7461 0 08:54 pts /10 00:00:00 ls
6 dmq292 7966 7960 0 Jun04 pts /13 00:00:00 assign1 . sh if of
7 xle135 8983 8636 0 08:59 pts /15 00:00:00 ssh ctf . cs . utsarr . net
8 zeh458 9057 1980 0 08:59 pts /7 00:00:00 vim prog . c
9 rslavin 9150 9139 0 08:59 pts /16 00:00:00 ps - af
10 xle135 8636 8628 0 08:58 pts /15 00:00:00 bash

【问题讨论】:

  • 哈哈,毕竟我找到了解决方案。我应该一直使用 !~ 而不是 !=。所以它是:$1 !~ /[a-z]{3}[0-9]{3}/ { next }
  • 运算符== 和!= 也代表等于和不等于。这些运算符不进行正则表达式比较,而是进行字符串或数字比较。如果要检查正则表达式,则必须使用运算符 ~ 和 !~。

标签: linux bash awk


【解决方案1】:

对于您显示的 Input_file,我们正在讨论的列是 $2 而不是 $1,所以理想情况下应该是:

awk '$2 !~ /[a-z]{3}[0-9]{3}/{next}.........' Input_file

另外,如果您想检查大小写两个字母,请尝试:

awk '$2 !~ /[a-zA-Z]{3}[0-9]{3}/{next}..........'  Input_file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    • 2023-01-03
    • 2023-03-20
    • 2020-10-16
    • 1970-01-01
    相关资源
    最近更新 更多