簡體   English   中英

使用awk的輸出來運行命令

[英]Using output of awk to run command

我是shell腳本的新手,似乎無法弄清楚這個看似簡單的任務。 我有一個大約250行的文本文件(ciphers.txt),我想使用每行的第一列作為命令中的參數。 任何幫助將不勝感激!

命令是:

openssl s_client -connect host:port -cipher argument

當我一次做一個時它工作正常,但我真的不想運行相同的命令250次以上。 到目前為止,這是我的腳本:

awk '{command = "openssl s_client -connect localhost:4433 -cipher > results.txt"
print $0 | command}' ciphers.txt

我一直收到錯誤,所以我很確定我在某處有語法錯誤。 awk的輸出是否在-cipher后附加?

使用awk中的system

awk '{ system("openssl s_client -connect host:port -cipher " $1) }' ciphers.txt

你的命令有很多問題。 對於想要使用第一列的人。 這在awk中被稱為$ 1而不是$ 0(這將是整行)。 其次,在命令定義的末尾忘記了分號。

要實際運行該命令,您可以使用system()或管道(后者只有在命令可以從stdin讀取時才有意義,我認為在您的情況下不會打開openssl)。 最簡單的就是這樣的

awk '{cmd="openssl s_client -connect host:port -cipher" $1; system(cmd)}' results.txt

請注意,這只會返回退出狀態。 如果需要捕獲stdout,則必須通過getline管道命令。

安德烈亞斯

PS:發布你得到的實際錯誤,會有所幫助。

xargs命令專門針對該用例。

awk '{print $0}' <ciphers.txt | xargs -I{} openssl s_client -connect host:port -cipher {} >>results.txt

這個版本對於示例案例來說有點長,因為awk已經被用來解析$0 但是,當你已經有一個要使用的東西列表並且沒有運行可以執行子shell的東西時, xargs會派上用場。 例如,下面可以使用awk來執行mvxargs更簡單。

ls -1 *.txt | xargs -I{} mv "{}" "{}.$(date '+%y%m%d')"

上面的命令將當前目錄中的每個文本文件重命名為帶日期戳的備份。 awk的等價物需要從date命令的結果中創建一個變量,將其傳遞給awk ,然后構造並執行該命令。

xargs命令還可以將多個參數累積到一行上,如果輸入有多列,或者在輸入文件中將單個記錄拆分為重復組,這將非常有用。

有關使用它的所有方法的更多信息,請查看UNIX Mantra上的“xargs”All-IN-One教程指南

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM