我需要创建一个脚本来解除/绑定linux机器中的所有usb。
为此,我需要运行:
lsusb -t wich返回:
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,输入是命令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
再次感谢!
发布于 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所做的事情,等等:
$ 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
请注意,如果您希望将其放到两个文件以及stdout中,那么您所需要的只是一个后续的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
}
}
由于对您已经处理过的bus+port组合重复操作似乎毫无意义(例如,第二个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
}
}
}
发布于 2014-11-04 15:59:27
不能在awk
中定义变量
var= $(echo $3 | grep -o "[1-9]"
做一些这样的事情:
awk -v var=$(echo $3 | grep -o "[1-9]" '{print var}' file
我不明白为什么你需要同时使用awk
和grep
https://stackoverflow.com/questions/26739414
复制相似问题