![](/img/trans.png)
[英]bash script needs to read user input and use it as the argument for another command
[英]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"...
兩者之間的區別在於第一種形式使arg
在BEGIN
塊中可用,而第二種形式在awk
打開文件之前解釋,因此它在BEGIN
塊中不可用,但可以為后續文件重新定義:
awk 'program' arg="value for file1" file1 arg="value for file2" file2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.