gpt4 book ai didi

linux - AWK 错误 - grep 处或附近的语法错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:55:15 25 4
gpt4 key购买 nike

我需要创建一个脚本来取消绑定(bind)/绑定(bind)一台 Linux 机器上的所有 USB。

为此我需要运行:

lsusb -t 返回:

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

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

 // 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

谁能提出解决方案或其他方法?

感谢阅读。

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

感谢 Ed Morton,输入是命令 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

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

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

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

2-4
2-6
2-6

再次感谢!

最佳答案

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

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

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

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

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

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

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

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

您在您的问题中发布了一些示例输入,现在更新它以显示您希望在该输入上运行工具后获得的特定输出,以便我们可以帮助您编写工具来执行此操作。

如果它有用,这里是 awk 脚本的正确 awk 语法,可以执行您尝试使用 echo 和 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

请注意,如果您希望它转到几个文件以及标准输出,那么您需要的只是后续的 echo+pipe+tee:

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
}
}
}

关于linux - AWK 错误 - grep 处或附近的语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26739414/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com