Linux
從歷史中提取唯一的單個命令
我創建了一個名為 histcopy.txt 的文件,其中包含命令歷史記錄 (
history > histcopy.txt
)。它看起來有點像這樣:1. l 2. ls 3. cat necopy.txt 4. netstat 5. cd | ls-l ; grep -i "3" histcopy.txt | echo
我想列印出每個獨特的命令,這是我到目前為止執行的命令:
awk '{print $2}' histcopy.txt | sort|uniq`
結果是:
l ls cat netstat cd
但在最後一行 (
5. cd | ls-l ; grep -i "3" histcopy.txt | echo
) 中,它忽略了許多命令,只接受第一個cd
. 如何重寫我目前的命令以便它也提取它們?所以從第 5 行它也將提取:
ls-l
grep -i "3: histcopy.txt
echo
使它們在輸出列表中成為單獨的項目。
$ cat histcopy.txt 1 l 2 ls 3 cat necopy.txt 4 netstat 5 cd | ls -l ; grep -i "3" histcopy.txt | echo $ sed 's/^\s*\S*\s*//' histcopy.txt | tr ';|' '\n' | awk '!seen[$1]++{print $1}' l ls cat netstat cd grep echo
sed 's/^\s*\S*\s*//'``history
刪除與輸出中的命令關聯的初始空格和數字tr ';|' '\n'
用換行符替換;
和。|
這將適用於目前的問題陳述,但如果替換中有命令等則無濟於事awk '!seen[$1]++{print $1}'
獨特的命令
perl
單獨 實現的類似邏輯$ perl -lne 's/^\s*\S+//; (@a)= split/[;|]/; foreach (@a){($k) = /^\s*\K(\S+)/; print $k if !$seen{$k}++}' histcopy.txt l ls cat netstat cd grep echo