登錄的用戶按字母順序列印在一行上。
因為在 bash 腳本中,使它作業的最小更改量是多少?
這是給定的腳本:
for name in $@
do
who | grep -w "^name" | sed 's/ .*//' | uniq
done | sort | tr '\n' ' '
echo
uj5u.com熱心網友回復:
單行命令:
who | awk '{print $1}' | sort | uniq | tr '\n' ' '
who: 登錄用戶串列。awk '{print $1}':只保留第一個單詞或每一行,即用戶名。sort:按字母順序排列用戶名。uniq: 洗掉重復項。tr '\n' ' ':洗掉回車,并用空格替換它們。
前任
$ who
steve tty7 Mar 5 16:25 (:0)
bernard tty7 Mar 5 16:25 (:0)
sarah tty7 Mar 5 16:25 (:0)
$ who | awk '{print $1}' | sort | uniq | tr '\n' ' '
bernard sara steve
您的代碼 did grep -w "^name",它告訴grep輸出以“名稱”開頭的行。 不是以變數“name”的值開頭的行。為此,您需要這樣做grep -w "^$name"。
uj5u.com熱心網友回復:
試試這個Shellcheck -clean 代碼:
for name in "$@"
do
who | sed 's/[[:space:]].*//' | grep -xF -- "$name"
done | sort -u | paste -sd ' '
$@應始終在其上加上雙引號 ("$@")。請參閱訪問 bash 命令列引數 $@ 與 $*。 如果不使用雙引號,Shellcheck 會正確地抱怨。sed 's/[[:space:]].*//'洗掉每個輸入行上的第一個空白字符及其之后的所有內容。使用[[:space:]]而不是文字空格字符意味著如果who輸出使用制表符作為分隔符,代碼仍然可以作業。它也可能更容易閱讀。該sed命令首先運行以確保用戶名占據整行,以便在下一個管道階段更容易避免虛假匹配。grep -xF -- "$name""$name"在輸入中搜索作為字串的整行。該-x選項強制匹配整行。例如,這可以防止與用戶名mary匹配的用戶名mary.jane(至少在某些 Linux 系統上是有效的用戶名)。該-F選項意味著“$name”中的正則運算式模式被視為文字字串。例如,這可以防止名稱與 namet.m匹配tim。--防止前導連字符被"$name"視為grep選項。據我所知,沒有任何系統允許用戶名帶有前導連字符,但是沒有什么可以阻止將這種無效名稱作為命令列引數提供給代碼。-w選項_grep在這里不會有用,因為有效名稱可能包含非單詞字符(例如t.m)。sort -u獲取for回圈的輸出(未排序的用戶名串列,每行一個,可能有重復)并對其進行排序。該-u選項導致它洗掉重復項(如管道到uniq,但保存行程創建)。paste -sd ' '將所有行放入輸入中,用空格分隔(由-d選項和' '(空格)選項引數指定),并以換行符結束。tr '\n' ' '會產生類似的效果,但它會產生一個帶有尾隨空格字符的未終止行。
uj5u.com熱心網友回復:
所有你需要的是:
who | sort -k1,1 -u | awk '{u=u s $1; s=OFS} END{print u}'
這將輸出所有登錄用戶的空白分隔串列,全部在 1 行上,并帶有終止換行符以使其成為有效的 POSIX 文本檔案,并且沒有不需要的尾隨空白字符。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/439453.html
標籤:重击
上一篇:如何符號鏈接別名和函式點檔案
