【问题标题】:how do i match a space with two shell variables inside awk in just one match function如何仅在一个匹配函数中将空格与 awk 中的两个 shell 变量匹配
【发布时间】:2011-09-26 11:33:10
【问题描述】:

我有一个命令:

ls -l | nawk -v d1=Sep -v d2=26 '{if(match($0,d1)) print $0}'
-rw-rw-r--   1 nobody   nobody        12 Sep 26 11:36 file1
-rw-rw-r--   1 nobody   nobody        14 Sep 26 11:37 file2
-rw-rw-r--   1 nobody   nobody         0 Sep 26 10:46 file3
-rw-rw-r--   1 nobody   nobody         0 Sep 26 10:44 file4
-rw-rw-r--   1 nobody   nobody         0 Sep 26 10:50 file5
-rw-rw-r--   1 nobody   nobody         0 Sep 26 11:00 file6
-rw-rw-r--   1 nobody   nobody         0 Sep 25 11:00 file7
-rw-rw-r--   1 nobody   nobody         0 Sep 26 14:22 ksh
-rwxrwxr-x   1 nobody   nobody       208 Sep 26 16:31 test.sh*
-rwxrwxr-x   1 nobody   nobody        62 Sep 26 15:15 test2.sh*

但是当我使用以下内容时:

ls -l | nawk -v d1=Sep -v d2=26 '{if(match($0,d1 d2)) print $0}'

它没有给我任何输出!!

如您所见,Sep 和 26 之间有一个空格,我在正则表达式中使用相同的空格来匹配字符串“Sep 26”。 有人可以帮忙吗?

我期望输出是:

-rw-rw-r--   1 nobody   nobody        12 Sep 26 11:36 file1
-rw-rw-r--   1 nobody   nobody        14 Sep 26 11:37 file2
-rw-rw-r--   1 nobody   nobody         0 Sep 26 10:46 file3
-rw-rw-r--   1 nobody   nobody         0 Sep 26 10:44 file4
-rw-rw-r--   1 nobody   nobody         0 Sep 26 10:50 file5
-rw-rw-r--   1 nobody   nobody         0 Sep 26 11:00 file6
-rw-rw-r--   1 nobody   nobody         0 Sep 26 14:22 ksh
-rwxrwxr-x   1 nobody   nobody       208 Sep 26 16:31 test.sh*
-rwxrwxr-x   1 nobody   nobody        62 Sep 26 15:15 test2.sh*

【问题讨论】:

  • 你期望它产生什么输出?
  • 我很惊讶地看到一个downvote!!!我认为这个问题很清楚。我正在尝试搜索日期为 9 月 26 日的文件..我希望输出只有文件'ls -l' 的日期是 9 月 26 日。Downvoter。请敢于发表评论。
  • 您不需要在"d1 d2" 周围加上引号吗?
  • 我已经尝试过“d1 d2”。这实际上会搜索 sting “d1 d2”,但不会搜索“Sep 26”

标签: shell unix awk solaris nawk


【解决方案1】:
kent$  echo "-rw-rw-r--   1 nobody   nobody        12 Sep 26 11:36 file1
-rw-rw-r--   1 nobody   nobody        14 Sep 26 11:37 file2
-rw-rw-r--   1 nobody   nobody         0 Sep 26 10:46 file3
-rw-rw-r--   1 nobody   nobody         0 Sep 26 10:44 file4
-rw-rw-r--   1 nobody   nobody         0 Sep 26 10:50 file5
-rw-rw-r--   1 nobody   nobody         0 Sep 26 11:00 file6
-rw-rw-r--   1 nobody   nobody         0 Sep 25 11:00 file7
-rw-rw-r--   1 nobody   nobody         0 Sep 26 14:22 ksh
-rwxrwxr-x   1 nobody   nobody       208 Sep 26 16:31 test.sh*
-rwxrwxr-x   1 nobody   nobody        62 Sep 26 15:15 test2.sh*
"|awk -v d1=Sep -v d2=26 'BEGIN{x=d1" "d2}{ if(match($0,x))print $0;}' 

-rw-rw-r--   1 nobody   nobody        12 Sep 26 11:36 file1
-rw-rw-r--   1 nobody   nobody        14 Sep 26 11:37 file2
-rw-rw-r--   1 nobody   nobody         0 Sep 26 10:46 file3
-rw-rw-r--   1 nobody   nobody         0 Sep 26 10:44 file4
-rw-rw-r--   1 nobody   nobody         0 Sep 26 10:50 file5
-rw-rw-r--   1 nobody   nobody         0 Sep 26 11:00 file6
-rw-rw-r--   1 nobody   nobody         0 Sep 26 14:22 ksh
-rwxrwxr-x   1 nobody   nobody       208 Sep 26 16:31 test.sh*
-rwxrwxr-x   1 nobody   nobody        62 Sep 26 15:15 test2.sh*

【讨论】:

  • 酷..谢谢一百万肯特。它有效。实际上我试过这个但我的问题是 d1' 'd2.不知怎么没用
  • @Rahul,它不起作用,因为您使用单引号将 awk 脚本括起来:您需要 awk 才能看到双引号
【解决方案2】:

假设用户名和组名不包含空格,下面是 awk 的做法:

ls -l | nawk -v d1=Sep -v d2=26 '{if(match($6, d1) && match($7, d2)) print $0}'
# NOTE                                 ----^^           ----^^

【讨论】:

  • 在发布这个问题之前我已经尝试过了。它也可以工作。我真正需要的是如何在一个匹配函数中将一个空间与两个 shell 变量 insdie awk 匹配。
猜你喜欢
  • 2019-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多