2015-04-20 2 views
0

У меня есть текстовый файл с кучей команд, например:Count и сортировать команды, используемые в истории

ls -l 
/bin/bash/ 
cat file.txt 
bash 
cat somethingElse 

Что я должен сделать, это, получить имена команд (ls, cat, bash) и посчитай их. Я уже сделал это:

cut -d' ' -f1 file.txt | tr ' ' '\n' | sort | uniq -c 

Это работает почти как я хотел бы - выход:

1 bash 
1 /bin/bash 
2 cat 
1 ls 

Единственное, здесь не так, он должен ИГНОРИРУЙТЕ Абсолютные пути, поэтому выход должен выглядеть следующим образом

2 bash 
2 cat 
1 cat 

Я пытался с петлей в то время как с утверждением, если в нем, который проверяет, есть ли «/» в строке, но это не похоже на работу.

ответ

1

С awk Вы можете сказать print $1, чтобы напечатать первое слово. Однако вам нужно только одно имя. Для этого вы можете использовать basename:

$ basename "/bin/bash" 
bash 

Тогда это вопрос вызова basename из awk. Все вместе:

$ awk '{system("basename "$1)}' a 
ls 
bash 
cat 
bash 
cat 

Затем вы можете трубы к sort и uniq:

$ awk '{system("basename "$1)}' a | sort | uniq -c 
     2 bash 
     2 cat 
     1 ls 
+0

Спасибо, работает как задумано! Есть ли способ «переделать» вашу команду, поэтому она также принимает трубы как часть команды? Допустим, есть строка, которая содержит: cat file.txt | сортировать | uniq -c, и он также будет считать sort и uniq как команды, которые подсчитываются и печатаются в cmd? –

+0

Возможно, вам стоит заменить трубы новыми строками: 'tr '|' '\ n' <файл' – fedorqui

+0

awk '{system ("basename" $ ​​1)}' "$ {@: -1}" | tr '|' '\ n' <"$ {@: -1}" | сортировать | uniq -c Я пробовал вот так, но он просто удваивает выход. btw $ {@: -1} - последний аргумент, который является файлом. –

Смежные вопросы