2014-11-04 106 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

相關問題