2014-11-01 71 views
-1

這只是我遇到很多問題的一個例子: 我想將所有.bash_histories複製到一個目錄。使用awk和sed從STDIN重新格式化並執行

grep "/bin/bash" /etc/passwd | awk -F: '{ print "cp " $6"/.bash_history /backup" $6 ".bash_history" }

輸出:

cp /home/peter/.bash_history /backup/home/peter/.bash_history 
cp /home/john/.bash_history /backup/home/john/.bash_history

我想是這樣的輸出:

cp /home/peter/.bash_history /backup/_home_peter_.bash_history 
cp /home/john/.bash_history /backup/_home_john_.bash_history

而且這種輸出將被執行。

(這不是專門對這個問題,但只是一般如何使用awk格式化和sed和執行新創建的命令行,沒有真正爲它創造一個腳本)

+0

你遇到什麼問題? – EWit 2014-11-01 13:42:19

+0

我想把$ 6的第二個表示中的斜槓轉換爲下劃線。我想要新創建的cp命令被執行。 – JakeRoberts 2014-11-01 14:59:59

回答

0
 
getent passwd | grep \/bin\/bash | cut -d ":" -f 6 | while read a; do eval "cp $a/.bash_history /backup/$(echo $a | sed 's#/#_#g')_.bash_history"; done 

工作完美!問題解決了!

+0

很高興聽到你可以使用答案=),有時我因爲沒有足夠的解釋而受到批評 - 你可以在你準備好後關閉問題(通過點擊接受答案鏈接)。 – 2014-11-02 13:21:17

0

的awk腳本獲得類似輸出將是

grep "/bin/bash" /etc/passwd |head -2 | awk -F: '{ print "cp " $6 "/.bash_history backup/_home_"$1".bash_history" }' 

給出的輸出像

cp /root/.bash_history backup/_home_root.bash_history 
cp /home/xxx/.bash_history backup/_home_xxx.bash_history 

現在序到excecute的命令中,system() functi在awk將是有幫助的

system(command)會超出任何命令,並返回值是命令的退出狀態。

上述腳本可以被修改爲

grep "/bin/bash" /etc/passwd |head -2 | awk -F: '{ system("cp " $6 "/.bash_history backup/_home_"$1".bash_history;") }' 

試運行:

$ grep "/bin/bash" /etc/passwd |head -2 | awk -F: '{ system("cp " $6 "/.bash_history backup/_home_"$1".bash_history;") }' 
$ ls backup/ 
_home_xxx.bash_history _home_root.bash_history 

PS:不建議建立在你的根文件夾目錄。所以我故意將/backup替換成backup

此外,爲了使腳本成功,backup文件夾必須事先創建。

+0

系統!這是我正在尋找的技巧!爲了這個特殊的目的,它完美地運作但第二我想格式6美元。現在從awk中獲取元素$ 1就足夠了。但總的來說,我想以6美元的價格做一個sed,所以我有更大的靈活性。但是非常感謝你!我對系統非常滿意。不知道這個! – JakeRoberts 2014-11-01 16:10:06

+0

*我想在$ 6上做一個sed *你在尋找什麼樣的靈活性? – nu11p01n73R 2014-11-01 16:12:52

+0

@JakeRoberts如果你找到答案,你可以接受它,這樣它會對其他人有用。謝謝:) – nu11p01n73R 2014-11-01 18:00:01

0

getent passwd | grep \/bin\/bash | cut -d ":" -f 6 | while read a; do eval "cp $a/.bash_history /backup/$(echo $a | sed 's#/#_#g')_.bash_history"; done

這使用getent獲取passwd文件和切得第6場喜歡你的awk聲明沒有的話,就由線讀取每個輸入行,並構建字符串,並將EVAL執行。

+0

超酷!謝謝! – JakeRoberts 2014-11-02 11:44:35