通过Bash脚本在文件中搜索结果错误

时间:2018-03-14 09:52:24

标签: bash shell

我正在搜索文件中的事件字段但输出错误。我在输入设备中搜索gpio-keys事件,我已经编写了一个脚本,但我无法在输出文件中打印任何内容(在我的情况下,我在按钮设备文件中写入它始终为null)。请帮我解决这个问题。我在脚本文件中哪里做错了?

Bash脚本:

#!/bin/bash

  if  grep -q  "gpio-keys" /proc/bus/input/devices  ; then
    EVENT=$(cat /proc/bus/input/devices | grep "Handlers=kbd")
    foo= `echo $EVENT | awk '{for(i=1;i<=NF;i++) if($i=="evbug")printf($(i-1))}'`
    #foo=${EVENT:(-7)}
    echo -n $foo > /home/ubuntu/Setups/buttonDevice
 fi

2 个答案:

答案 0 :(得分:1)

Prakash,我无法访问您的谷歌硬盘。但我只是想给你一些建议: -

foo= `echo $EVENT | awk '{for(i=1;i<=NF;i++) if($i=="evbug")printf($(i-1))}'`

这是旧式的。更好用如下: -

foo=$(echo $EVENT | awk '{for(i=1;i<=NF;i++) if($i=="evbug")printf($(i-1))}')

在回显变量时也总是使用双引号“”。见下文: -

echo -n "$foo" > /home/ubuntu/Setups/buttonDevice

尝试使用以下代码,它将适合您

#!/bin/bash

 if  grep   "gpio-keys" /proc/bus/input/devices >/dev/null ; then
    cat /proc/bus/input/devices | grep "Handlers=kbd" | awk '{for(i=1;i<=NF;i++){ if($i ~ /eve/){printf "%s \n", $i} } }') > /home/ubuntu/Setups/buttonDevice
 fi

buttonDevice中的输出将是

  

EVENT0
  事件1
  。
  。
  。
  。
  event100

答案 1 :(得分:1)

  

我仍然无法在buttondevce中获得任何内容

毫无疑问,因为在输入行

H: Handlers=kbd event0

evbug您的awk脚本正在寻找。

  

我的情况是event0,但它可能会有所不同,这取决于内核的允许程度。

如果是event0 或类似的,那么查找evbug是没有意义的。更改声明

if($i=="evbug")printf($(i-1))

if ($i~"event") print $i

(使用正则表达式匹配)。

  

我已经像上面那样改写了我的剧本。但通过它,我有两个事件(event0,event3),但...我的输入设备很多,但我想要gpio-keys事件

Aha - 为了只从gpio-keys部分获取处理程序行,您可以将sed与地址范围一起使用:

  EVENT=`sed -n '/gpio-keys/,/Handlers=kbd/s/.*Handlers=kbd //p' </proc/bus/input/devices`