首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AWK错误-在grep或接近grep时的语法错误

AWK错误-在grep或接近grep时的语法错误
EN

Stack Overflow用户
提问于 2014-11-04 15:52:56
回答 2查看 1.3K关注 0票数 1

我需要创建一个脚本来解除/绑定linux机器中的所有usb。

为此,我需要运行:

lsusb -t wich返回:

代码语言:javascript
运行
复制
root@lsdg7sd-fc:~# 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

现在,对于这个示例,我需要运行:

代码语言:javascript
运行
复制
 // 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非常陌生)来实现这一点,我做了以下工作:

代码语言:javascript
运行
复制
#!/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,我尝试了所有可能的组合。我总是会犯错误。

代码语言:javascript
运行
复制
awk: line 8: syntax error at or near grep

有人能提出解决方案或其他方法吗?

感谢您的阅读。

--?

谢谢Ed,输入是命令lsusb -t:(在我的末尾)的结果。

代码语言:javascript
运行
复制
/:  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

我想解析这些信息,以便得到总线号和端口号。因此,产出应该是:

代码语言:javascript
运行
复制
2-1
2-4
2-6
2-6
1-1

但是,我只需要“子”端口,所以我需要以下输出:

代码语言:javascript
运行
复制
2-4
2-6
2-6

再次感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-04 17:01:46

shell是一个调用UNIX工具的环境,带有一种对这些调用进行排序的语言。

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

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

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

您可以从shell调用grep以找到regexp并打印匹配的行。

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

您不会从awk调用grep,也不能从grep调用awk。

在一些非常罕见的情况下,您可以从awk调用shell,这是有用的,但不能从grep调用shell。

您在您的问题中发布了一些示例输入,现在更新它以显示您希望在该输入上运行工具所获得的特定输出,这样我们就可以帮助您编写该工具。

如果有用的话,下面是awk脚本的正确awk语法,用于执行您试图使用echo和grep所做的事情,等等:

代码语言:javascript
运行
复制
$ 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

鉴于你最新的问题:

代码语言:javascript
运行
复制
$ cat tst.awk
{
    var = $3+0
    if (/\/:/) {
        bus = var
    }
    else {
        print bus "-" var
    }
}
$
$ awk -f tst.awk file
2-4
2-6
2-6

请注意,如果您希望将其放到两个文件以及stdout中,那么您所需要的只是一个后续的echo+pipe+tee:

代码语言:javascript
运行
复制
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
    }
}

由于对您已经处理过的bus+port组合重复操作似乎毫无意义(例如,第二个2-6):

代码语言:javascript
运行
复制
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
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2014-11-04 15:59:27

不能在awk中定义变量

代码语言:javascript
运行
复制
var= $(echo $3 | grep -o "[1-9]"

做一些这样的事情:

代码语言:javascript
运行
复制
awk -v var=$(echo $3 | grep -o "[1-9]" '{print var}' file

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26739414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档