AWK错误 - 在grep或grep附近的语法错误
我需要创建一个脚本来解除/绑定一台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
谢谢!
壳一个可以调用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
}
}
}
感谢您的回复。我想要做的是执行这个命令。回声'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
我从来没有听说过的命令的lsusb的,也让我知道你的意思,当你谈论“然后再次绑定”,等等。我不知道你在工作的域。我所知道的是如何使用shell命令使用awk和/或其他UNIX工具将文本从一种格式转换为另一种格式,所以如果您需要帮助,请更新您的问题以根据要求显示样本输入和预期输出。如果你只是想'执行这个命令。回声'2-4'| tee/sys/bus/usb/drivers/usb/unbind'然后继续并执行该命令,但这与您发布的输入看起来完全无关 – 2014-11-04 17:17:00
我已用您请求的信息更新了该问题。谢谢您的帮助! – Juano7894 2014-11-04 17:29:31
不能定义变量中awk
var= $(echo $3 | grep -o "[1-9]"
做一些这样的:
awk -v var=$(echo $3 | grep -o "[1-9]" '{print var}' file
PS我不明白为什么你需要同时使用awk
和grep
我想'$ 3'在他的剧本旨在对他的投入,而不是传给了他的shell脚本的第三个参数的每行的第三场。如果你已经在使用awk,那么你就不会使用grep。 – 2014-11-04 17:24:21
你有awk与shell脚本混淆在这里。几乎没有一个“awk脚本”实际上是一个有效的awk脚本。 – 2014-11-04 16:00:12
也不宜用陈旧过时的背抽动,这样使用括号:'VAR = $(回声“02.Port” | grep的-o“[1-9]”);' – Jotne 2014-11-04 16:02:17
感谢您的意见!我将开始使用$(),而不是背抽动 – Juano7894 2014-11-04 17:16:53