[英]How to add quotes for awk when single and double quotes are already used?
我想寫一個別名,以便我的 squeue 命令只輸出正在運行的模擬。 對於我的 squeue 命令,我在 my.bashrc 中有一個別名,如下所示
alias sq='squeue -u as1056 --format="%.18i %.36j %.8u %.2t %.10M %.10L %.6D %.6C %.12P %R"'
有了這個,我可以 output 運行模擬為
sq | awk '$4 == "R" {print $0}'
這在命令行中按預期工作。 我現在想將此命令添加為別名
alias sqrun='sq | awk "$4 == \"R\" {print $0}"'
如您所見,等號后的單引號已經用盡,因此在 awk 命令后需要雙引號。 但是,要匹配第 4 列中的模式,我需要指定另一個字符串。 由於已經使用了單引號和雙引號,我不確定在這種情況下如何指定字符串。 我嘗試使用反斜杠 escaping 雙引號,但它會引發錯誤:
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的第一個問題,所以如果您發現我提出這個問題的方式有任何錯誤,我將不勝感激!
您可以通過雙引號單引號鏈接單引號部分
alias sqrun='sq | awk '"'"' $4 == "R" {print $0} '"'"' '
為了清楚起見,添加了額外的空間,但不是必需的。 然而,這些嵌套的引號可能變得非常難以閱讀,並且可能不是一個好主意,除非只是用於瑣碎的情況和丟棄的腳本。
awk 腳本包含$
並且當您將 awk 腳本周圍的引號從'
更改為"
時,它會使$
將它們視為變量來替代。
alias sqrun='sq | awk "\$4 == \"R\" {print \$0}"'
我會用一個簡單的 go :
alias sqrun='sq | awk '\''$4 == "R" {print $0}'\'
或使用 function,如@DiegoTorresMilano 建議:
sqrun() { sq | awk '$4 == "R" {print $0}'; }
或者如果有多個別名要定義:
#!/bin/bash
while IFS='' read -r line
do
alias "${line%%: *}=${line#*: }"
done <<'EOF'
sq: 'squeue -u as1056 --format="%.18i %.36j %.8u %.2t %.10M %.10L %.6D %.6C %.12P %R"'
squn: sq | awk '$4 == "R" {print $0}'
EOF
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.