2014-11-04 105 views
1

我需要创建一个脚本来解除/绑定一台Linux机器上的所有USB。AWK错误 - 在grep或grep附近的语法错误

为此,我需要运行:

-t的lsusb至极的回报:

[email protected]:~# lsusb -t 
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ohci_hcd/10p, 12M 
    |__ Port 4: Dev 2, If 0, Class=vend., Driver=ftdi_sio, 12M 
    |__ Port 6: Dev 4, If 0, Class=HID, Driver=usbhid, 1.5M 
    |__ Port 6: Dev 4, If 1, Class=HID, Driver=usbhid, 1.5M 
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci_hcd/10p, 480M 

现在,在这个例子中,我需要运行:

// disable the bus 1, port 1 
echo '2-4' | tee /sys/bus/usb/drivers/usb/unbind 
// disable the bus 1, port 2 
echo '2-6' | tee /sys/bus/usb/drivers/usb/unbind 
// enable the bus 1, port 1 
echo '2-4' | tee /sys/bus/usb/drivers/usb/bind 
// enable the bus 1, port 2 
echo '2-6' | tee /sys/bus/usb/drivers/usb/bind 

为了实现这一目标通过创建脚本(我对Linux非常新颖),我做了以下操作:

#!/bin/bash 

lsusb -t | awk '{ 

bus=""; 
if($1=="|__") 
     print "Child USB Port: ",$3; 
else if ($1=="/:") { 
     print $3; 
     var= $(echo $3 | grep -o "[1-9]"); 
     echo $var; 
} 
}' 

var=`echo "02.Port" | grep -o "[1-9]"`; 
echo $var; 
var=`echo "02.Port" | grep -o "[0-9]\{2\}"`; 
echo $var; 

我尝试了所有可能的组合,以便设置var。我总是得到一个错误。

awk: line 8: syntax error at or near grep 

任何人都可以提出解决方案或其他方法吗?

感谢您的阅读。

----------------------更新

感谢埃德莫顿,输入是命令的结果-t的lsusb(在我结束)

/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ohci_hcd/10p, 12M 
    |__ Port 4: Dev 2, If 0, Class=vend., Driver=ftdi_sio, 12M 
    |__ Port 6: Dev 4, If 0, Class=HID, Driver=usbhid, 1.5M 
    |__ Port 6: Dev 4, If 1, Class=HID, Driver=usbhid, 1.5M 
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci_hcd/10p, 480M 

而我想解析这些信息以获得总线号和端口号。所以输出应该是:

2-1 
2-4 
2-6 
2-6 
1-1 

但是,我只需要在“儿​​童”的端口,所以我需要以下的输出:再次

2-4 
2-6 
2-6 

谢谢!

+1

你有awk与shell脚本混淆在这里。几乎没有一个“awk脚本”实际上是一个有效的awk脚本。 – 2014-11-04 16:00:12

+0

也不宜用陈旧过时的背抽动,这样使用括号:'VAR = $(回声“02.Port” | grep的-o“[1-9]”);' – Jotne 2014-11-04 16:02:17

+0

感谢您的意见!我将开始使用$(),而不是背抽动 – Juano7894 2014-11-04 17:16:53

回答

1

壳一个可以调用UNIX工具的环境,用一种语言来排序这些调用。

grep是一个UNIX工具,用于打印来自匹配正则表达式的文件(或管道)的行。

awk是处理文本的标准通用UNIX工具。

它们是3种完全不同的工具,具有自己的语言/语法。

您可以从shell调用grep来查找正则表达式并打印匹配的行。

您可以从shell调用awk来执行更复杂的文本操作操作,这些操作可能包含或不包含grep可以执行的任何操作。

你不会把从AWK grep和你不能从grep的awk的调用。

您还可以从外壳AWK一些非常稀少的情况下是有用的,但你不能从grep的叫壳。

你在你的问题发布了一些样品输入,立即更新,以显示你想获得为运行该输入工具的结果,所以我们可以帮你写做到这一点的工具特定的输出。

在情况下,它是非常有用的,这里是一个awk脚本正确awk的语法做你正在尝试与回声和grep等:

$ cat tst.awk 
{ 
    if (/\|__/) { 
     print "Child USB Port: ",$3 
    } 
    else { 
     print $3 
     var = $3 
     gsub(/[^[:digit:]]/,"",var) 
     print var 
    } 
} 
$ 
$ awk -f tst.awk file 
02.Port 
02 
Child USB Port: 4: 
Child USB Port: 6: 
Child USB Port: 6: 
01.Port 
01 

鉴于你更新的问题做到:

$ cat tst.awk 
{ 
    var = $3+0 
    if (/\/:/) { 
     bus = var 
    } 
    else { 
     print bus "-" var 
    } 
} 
$ 
$ awk -f tst.awk file 
2-4 
2-6 
2-6 

请注意,如果你想要那个去几个文件以及标准输出,那么所有你需要的,而不是随后的回声+管+三通是:

BEGIN{ 
    path = "/sys/bus/usb/drivers/usb/" 
    unbind = path "unbind" 
    bind = path "bind" 
} 
{ 
    var = $3+0 
    if (/\/:/) { 
     bus = var 
    } 
    else { 
     busPort = bus "-" var 
     print busPort 
     print busPort > unbind 
     print busPort > bind 
    } 
} 

并且因为重复您已经处理的公交+港口组合的行动似乎毫无意义(例如,第二个2-6):

BEGIN{ 
    path = "/sys/bus/usb/drivers/usb/" 
    unbind = path "unbind" 
    bind = path "bind" 
} 
{ 
    var = $3+0 
    if (/\/:/) { 
     bus = var 
    } 
    else { 
     busPort = bus "-" var 
     if (!seen[busPort]++) { 
      print busPort 
      print busPort > unbind 
      print busPort > bind 
     } 
    } 
} 
+0

感谢您的回复。我想要做的是执行这个命令。回声'2-4'| tee/sys/bus/usb/drivers/usb/unbind(然后再次绑定。)。我需要的是编写脚本来查找BUS和端口号以执行此命令。我在另一个问题上想,如ls/sys/bus/usb/drivers/usb | grep“ - ”,这将返回我所需要的。但我想学习,如果你知道使用lsusb命令来实现这个目标的另一种方式,那将非常棒! – Juano7894 2014-11-04 17:11:31

+1

我从来没有听说过的命令的lsusb的,也让我知道你的意思,当你谈论“然后再次绑定”,等等。我不知道你在工作的域。我所知道的是如何使用shell命令使用awk和/或其他UNIX工具将文本从一种格式转换为另一种格式,所以如果您需要帮助,请更新您的问题以根据要求显示样本输入和预期输出。如果你只是想'执行这个命令。回声'2-4'| tee/sys/bus/usb/drivers/usb/unbind'然后继续并执行该命令,但这与您发布的输入看起来完全无关 – 2014-11-04 17:17:00

+1

我已用您请求的信息更新了该问题。谢谢您的帮助! – Juano7894 2014-11-04 17:29:31

0

不能定义变量中awk

var= $(echo $3 | grep -o "[1-9]" 

做一些这样的:

awk -v var=$(echo $3 | grep -o "[1-9]" '{print var}' file 

PS我不明白为什么你需要同时使用awkgrep

+0

我想'$ 3'在他的剧本旨在对他的投入,而不是传给了他的shell脚本的第三个参数的每行的第三场。如果你已经在使用awk,那么你就不会使用grep。 – 2014-11-04 17:24:21

相关问题