Linux

從歷史中提取唯一的單個命令

  • November 23, 2016

我創建了一個名為 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

引用自:https://unix.stackexchange.com/questions/325424