簡體   English   中英

已經使用單引號和雙引號時,如何為 awk 添加引號?

[英]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.

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