如何讓這個 awk 指令起作用

如何讓這個 awk 指令起作用

我想讓下面的命令起作用,但我做不到。請檢查一下:

echo "random string random string mark: abcde random string random string" |
    awk '{gensub(/^.*mark: (.{5,5}).*$/,"\\1","g"); print}'

我希望這個命令只回傳“abcde”。但它總是返回整個輸入字串。為什麼?

答案1

指令 gensub 不會更改字串。結果是函數的輸出。

請嘗試:

echo "random string random string mark: abcde random string random string" |
awk '{print(gensub(/^.*mark: (.{5,5}).*$/,"\\1","g"))}'

編輯:

事實證明,用戶需要解析頂部輸出,這就是(按照用戶的要求):

top -b -n 1 -d 1 |
awk 'NR==1{print(gensub(/.*load average: ([0-9\.\, ]+).*$/,"\\1","gs"))}'

注意:對於使用逗號作為小數點分隔符號的區域設置,它允許使用點和逗號。

請看一下 mpstat如此處介紹的,它可能更適合您的需求。

答案2

重新表述您的問題:您想要列印字串「mark:」之後的第一個單字。

途中,在 awk 中:

echo "random string random string mark: abcde random string random string" | \
awk -v RS="mark: " 'NR==2{print $1}'

上面的程式碼將字串拆分為兩個由「mark:」分隔的記錄,然後列印第二個記錄的第一個單字(即「abcde」)。

在 sed 中:

echo "random string random string mark: abcde random string random string" | \
sed 's/.*mark: \([^ ]*\).*/\1/'

上面使用正規表示式查找“mark:”之後的第一個非空格單詞,並用該單字替換整個字串。

相關內容