我想從命令輸出中提取一個字串,但同時洗掉一個子字串。例如
字串 =活動:自 2022 年 3 月 12 日星期六 20:02:20 PKT 起活動(運行);1 小時 31 分鐘前
我想要的 =自 20:02:20 PKT 起活躍(運行)
已移除
- 積極的:
- 星期六 2022-03-12
- ; 1 小時 31 分鐘前
為此,我最初一直在使用正則運算式
sudo service sshd status |grep -Po '(?<=Active: )(.*) since (.*);'
active (running) since Mon 2022-03-14 01:06:43 PKT;
你能告訴我如何忽略日期和最后一個分號嗎?同時只保留時間并且輸出完全像:
active (running) since 01:06:43 PKT
謝謝
uj5u.com熱心網友回復:
您可以使用
sed -nE 's/^Active: (.* since ).*([0-9]{2}:[0-9]{2}:[0-9]{2}[^;]*).*/\1\2/p'
詳情:
-nE-n禁止默認行輸出并E啟用 POSIX ERE 正則運算式語法^Active: (.* since ).*([0-9]{2}:[0-9]{2}:[0-9]{2}[^;]*).*- 找到匹配的行^Active:- 字串開頭,Active:以及一個或多個空格(.* since )- 第 1 組 (\1):任何文本,然后是空格since空格.*- 任何文字([0-9]{2}:[0-9]{2}:[0-9]{2}[^;]*)- 兩位數,:, 兩位數,:, 兩位數, 然后是除;.*- 字串的其余部分
\1\2- 連接第 1 組和第 2 組值p-p沖洗替換的結果。
查看在線演示:
#!/bin/bash
s='Active: active (running) since Sat 2022-03-12 20:02:20 PKT; 1h 31min ago'
sed -nE 's/^Active: (.* since ).*([0-9]{2}:[0-9]{2}:[0-9]{2}[^;]*).*/\1\2/p' <<< "$s"
輸出:
active (running) since 20:02:20 PKT
uj5u.com熱心網友回復:
將此附加到您的命令以使用空格并;作為欄位分隔符:
| awk 'BEGIN{ FS="[ ;]" } { print $2,$3,$4,$7,$8 }'
輸出:
自 20:02:20 PKT 起活躍(運行)
uj5u.com熱心網友回復:
使用您顯示的示例,請嘗試以下awk代碼。用 GNU 撰寫和測驗awk。簡單的解釋是,創建一個名為的 shell 變數val并將其值發送到awk然后在awk程式中我使用match函式來匹配正則運算式以獲得所需的值。
val="Active: active (running) since Sat 2022-03-12 20:02:20 PKT; 1h 31min ago"
echo "$val" |
awk '
match($0,/^Active:[[:space:]] active \(running\)[[:space:]] .*[0-9]{4}(-[0-9]{2}){2}[[:space:]] ([0-9]{2}:){2}[0-9]{2}[^;]*/){
val=substr($0,RSTART,RLENGTH)
sub(/^Active:[[:space:]] /,"",val)
sub(/since[[:space:]] \S \s \S /,"since",val)
print val
}
'
正則運算式的解釋:
^Active:[[:space:]] ##Matching value starting from Active: followed by space(s).
active \(running\) ##matching active followed by a space followed by (running).
[[:space:]] .*[0-9]{4} ##Matching 1 or more spaces then using greedy match to match 4 occurrences of digits.
(-[0-9]{2}){2} ##Matching - followed by 2 digits and this whole combination 2 times.
[[:space:]] ([0-9]{2}:){2} ##Matching space(s) followed by 2 digits followed by colon and this whole combination 2 times.
[0-9]{2}[^;]* ##Matching 2 digits and everything after it till a semi-colon comes.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/445467.html
