簡體   English   中英

在awk命令中使用bash腳本$ 1參數

[英]Use bash script $1 argument in awk command

我想創建一個bash腳本,它接受一個參數並使用awk來打印if

這是一個孤兒過程:

#find_orphan.sh :

ps -elf | awk '/$1/&&!/awk/ {if ($5 == 1){print $15}}'

不幸的是,我遇到問題,以便將$ 1作為bash參數呈現..

如果我不使用$ 1運行它,我的程序將工作:

ps -elf | awk '/some_program/&&!/awk/ {if ($5 == 1){print $15}}'

我真的需要能夠在bash腳本參數中指定awk搜索模式。

有幫助嗎?

使用awk -v var=val將命令行值傳遞給awk,並使用$0 ~ val語法使用regex進行比較:

ps -elf | awk -v arg="$1" '$0 ~ arg && !/awk/ && $5 == 1{print $15}'

沒有正則表達式:

ps -elf | awk -v arg="$1" 'index($0, arg) && !/awk/ && $5 == 1{print $15}'

Shell變量僅在雙引號內(或根本沒有引號)擴展,而不是單引號。 你可以試試

ps -elf | awk '/'$1'/&&!/awk/ {if ($5 == 1){print $15}}'

對於awk,我認為anubhavas解決方案更好,但這也適用於與其他工具類似的情況。

注意:我知道這並沒有解決標題中的問題; 它是解決文本中提出的實際問題的方法。 關於awk的問題在下面回答。

很少需要解析ps輸出,因為你可以讓ps生成你想要的任何字段。 此外,您會發現pgrep比過程名稱的ps更容易使用且更可靠。 pgrep默認安裝在許多Linux發行版上; 如果它沒有安裝在你的上面,請查看procps-ng主頁以獲取下載。

pgrep可以直接搜索具有特定父pid的進程:

pgrep -P 1 "$1"

這將打印出一個過程號列表(pids); 您可以使用-l選項生成進程名稱:

pgrep -l -P 1 "$1"

如果你想要完整的命令行,你應該將pid傳遞給ps並告訴它只生成cmd

pgrep -P 1 "$1" | xargs ps -ocmd=

或者,如果您願意,可以使用PID和命令行:

pgrep -P 1 "$1" | xargs ps -opid=,cmd=

(漏下=如果你想看到的列標題。)


將命令行參數傳遞給awk腳本的最佳方法是在命令行上設置變量。 有兩種方法可以做到這一點:

awk -v arg="$1" 'program' "filename"...

awk 'program' arg="$1" "filename"...

兩者之間的區別在於第一種形式使argBEGIN塊中可用,而第二種形式在awk打開文件之前解釋,因此它在BEGIN塊中不可用,但可以為后續文件重新定義:

awk 'program' arg="value for file1" file1 arg="value for file2" file2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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