我想寫一個別名,以便我的 squeue 命令只輸出正在運行的模擬。對于我的 squeue 命令,我的 .bashrc 中有一個別名,如下所示
alias sq='squeue -u as1056 --format="%.18i %.36j %.8u %.2t %.10M %.10L %.6D %.6C %.12P %R"'
有了這個,我可以將正在運行的模擬輸出為
sq | awk '$4 == "R" {print $0}'
這在命令列中按預期作業。我現在想將此命令添加為別名
alias sqrun='sq | awk "$4 == \"R\" {print $0}"'
如您所見,等號后的單引號已用完,因此 awk 命令后需要雙引號。但是,要匹配第 4 列中的模式,我需要指定另一個字串。由于已經使用了單引號和雙引號,我不確定在這種情況下如何指定字串。我嘗試使用反斜杠轉義雙引號,但它引發錯誤:
awk: cmd. line:1: == "R" {print -bash}
awk: cmd. line:1: ^ syntax error
那么在這種情況下我應該如何指定別名呢?
Edit1:通過在 sq 命令中匹配一個簡單的 R 模式,有一種骯臟的方法。問題是它經常匹配包含“DRAINED”一詞的列。所以我可以使用 sed 來洗掉這些行。所以像
sq | awk "/R/ {print $0}" | sed "/DRAINED/d"
不會遇到命令中有 3 個引號的問題。但是我想避免這種方法,因為它不是通用的,并且如果碰巧有一列包含 R 但不包含“DRAINED”一詞,則可能會給出錯誤的結果。
PS:這是我在 stackoverflow 上的第一個問題,所以如果您發現我問這個問題的方式有任何錯誤,我將感謝您的反饋!
uj5u.com熱心網友回復:
我會用一個簡單的:
alias sqrun='sq | awk '\''$4 == "R" {print $0}'\'
或者使用一個函式,如@DiegoTorresMilano 建議的(但與別名不同,找到一個你忘記的函式名稱并不容易):
sqrun() { sq | awk '$4 == "R" {print $0}'; }
或者如果要定義多個別名:
#!/bin/sh
# A little magic that will show you the way:
while IFS='' read -r cmd
do
# define a dummy alias
alias "unamed=$cmd"
# then show it
alias unamed
done <<'EOF'
squeue -u as1056 --format="%.18i %.36j %.8u %.2t %.10M %.10L %.6D %.6C %.12P %R"
sq | awk '$4 == "R" {print $0}'
EOF
現在您可以將輸出復制粘貼到您的 .bashrc 并為您的別名命令設定一個名稱
筆記:
<<'EOF'...EOF是參考 here-document;它將while用其內容提供命令(回圈)的標準輸入。當援引這意味著外殼不會擴大它里面什么。該
read命令從 stdin 中讀取一行(以 here-document 提供)。在IFS=''和-r選項都存在,以防止read修改該行。
uj5u.com熱心網友回復:
您可以通過雙引號單引號鏈接單引號部分
alias sqrun='sq | awk '"'"' $4 == "R" {print $0} '"'"' '
為清晰起見添加了額外的空間,但不是必需的。然而,這些嵌套的引號可能變得非常難以閱讀并且可能不是一個好主意,除非僅用于瑣碎的情況和丟棄腳本。
uj5u.com熱心網友回復:
awk 腳本包含 $并且當您將 awk 腳本周圍的引號從'更改為 時",它會使 bash 將它們視為要替換的變數。你也必須逃脫$:
alias sqrun='sq | awk "\$4 == \"R\" {print \$0}"'
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/368378.html
