Самые мощные примеры команд или скриптов Unix, которые должен знать каждый программист
Есть много вещей, которые должны знать все программисты, но меня особенно интересуют команды Unix/Linux, которые мы все должны знать. Для выполнения задач, с которыми мы можем столкнуться в какой-то момент, например рефакторинг, отчетов, сетевых обновлений и т.д.
Причина, по которой мне любопытно, состоит в том, что, ранее работая программным тестером в компании-разработчике программного обеспечения, пока я изучаю свою степень, я заметил, что у всех разработчиков (разработчиков программного обеспечения для Windows) было 2 компьютера.
Слева была их машина для разработки Windows XP, а справа - ящик Linux. Я думаю, это был Ubuntu. В любом случае они сказали мне, что они использовали его, потому что он обеспечивал мощные операции unix, которые Windows не могла выполнить в процессе разработки.
Мне любопытно узнать, как разработчик программного обеспечения, как вы считаете, являются одними из самых мощных сценариев/команд/применений, которые вы можете выполнять в операционной системе Unix/Linux, которые каждый программист должен знать для решения реальных задач которые могут не обязательно относиться к написанию кода?
Мы все знаем, что делать sed, awk и grep. Меня интересуют некоторые фактические фрагменты сценариев Unix/Linux, которые решили для вас трудную проблему, так что другие программисты могут извлечь выгоду. Просьба представить свою историю и источник.
Я уверен, что существует множество подобных примеров, которые люди хранят в своей папке Сценарии.
Обновление: Люди, похоже, неправильно истолковывают вопрос. Я не прошу назвать имена отдельных команд unix, а не код UNIX фрагменты, которые решили проблему для вас.
Лучшие ответы сообщества
Пройдите дерево каталогов и распечатайте пути к любым файлам, которые соответствуют регулярному выражению:
find . -exec grep -l -e 'myregex' {} \; >> outfile.txt
Вызвать редактор по умолчанию (Nano/ViM)
(работает на большинстве Unix-систем, включая Mac OS X) Редактор по умолчанию - это ваш msgstr "переменная окружения РЕДАКТОР. установлен в. т.е.: экспорт EDITOR =/usr/bin/pico, который расположенный в ~/.profile в Mac OS X.
Ctrl+x Ctrl+e
Список всех запущенных сетевых подключений (включая приложение, к которому они принадлежат)
lsof -i -nP
Очистить историю поиска терминала (Еще один из моих избранных)
history -c
Ответы
Ответ 1
Лучшие ответы сообщества
Пройдите дерево каталогов и распечатайте пути к любым файлам, которые соответствуют регулярному выражению:
find . -exec grep -l -e 'myregex' {} \; >> outfile.txt
Вызвать редактор по умолчанию (Nano/ViM)
(работает на большинстве Unix-систем, включая Mac OS X) Редактор по умолчанию - это ваш msgstr "переменная окружения РЕДАКТОР. установлен в. т.е.: экспорт EDITOR =/usr/bin/pico, который расположенный в ~/.profile в Mac OS X.
Ctrl+x Ctrl+e
Список всех запущенных сетевых подключений (включая приложение, к которому они принадлежат)
lsof -i -nP
Очистить историю поиска терминала (Еще один из моих избранных)
history -c
Ответ 2
Я нахожу commandlinefu.com, чтобы стать отличным ресурсом для различных рецептов сценариев оболочки.
Примеры
Общие
# Run the last command as root
sudo !!
# Rapidly invoke an editor to write a long, complex, or tricky command
ctrl-x ctrl-e
# Execute a command at a given time
echo "ls -l" | at midnight
Эзотерический
# output your microphone to a remote computer speaker
dd if=/dev/dsp | ssh -c arcfour -C [email protected] dd of=/dev/dsp
Ответ 3
Как выйти из VI
: WQ
Сохраняет файл и заканчивает страдания.
Альтернативой ":wq
" является ":x
", чтобы сохранить и закрыть редактор vi.
Ответ 4
Много мощности Unix исходит из его способности манипулировать текстовыми файлами и фильтровать данные. Конечно, вы можете получить все эти команды для Windows. Они просто не являются родными в ОС, как в Unix.
и возможность связывать команды вместе с трубами и т.д. Это может создавать чрезвычайно мощные одиночные строки команд из простых функций.
Ответ 5
Ваша оболочка - самый мощный инструмент, который у вас есть
- возможность писать простые циклы и т.д.
- понимание файлового globbing (например, *.java и т.д.)
- возможность компоновать команды через каналы, подоболочки. перенаправление и т.д.
Наличие такого уровня знаний о оболочке позволяет делать огромные суммы в командной строке без необходимости записывать информацию через временные текстовые файлы, копировать/вставлять и т.д., а также использовать огромное количество программ-утилит, которые разрешают нарезку /dicing данных.
Unix Power Tools покажет вам столько всего. Каждый раз, когда я открываю свою копию, я нахожу что-то новое.
Ответ 6
Я так сильно использую это, что мне действительно стыдно за себя. Удалите пробелы из всех имен файлов и замените их символом подчеркивания:
[removespaces.sh]
#!/bin/bash
find . -type f -name "* *" | while read file
do
mv "$file" "${file// /_}"
done
Ответ 7
Мой личный фаворит - это команда lsof.
"lsof" может использоваться для отображения открытых дескрипторов файлов, сокетов и труб.
Я считаю это чрезвычайно полезным при попытке выяснить, какие процессы использовали порты/файлы на моей машине.
Пример: список всех подключений к Интернету без разрешения имени хоста и без преобразования имени порта в порт.
lsof -i -nP
http://www.manpagez.com/man/8/lsof/
Ответ 8
Если вы делаете опечатку в длинной команде, вы можете повторно выполнить команду с заменой (в bash):
mkdir ~/aewseomeDirectory
вы можете увидеть, что "awesome" неверно, вы можете ввести следующее для повторного запуска команды с исправленной опечаткой
^aew^awe
он выводит то, что он заменил (mkdir ~/aweseomeDirectory
), и запускает команду. (не забудьте отменить повреждение, которое вы сделали с неправильной командой!)
Ответ 9
Команда tr - самая недооцененная команда в Unix:
#Convert all input to upper case
ls | tr a-z A-Z
#take the output and put into a single line
ls | tr "\n" " "
#get rid of all numbers
ls -lt | tr -d 0-9
Ответ 10
При решении проблем с неисправными linux-боксами, наиболее распространенной ключевой последовательностью, которую я печатаю в конце, является alt + sysrq REISUB
Ответ 11
Сила этих инструментов (grep find, awk, sed) исходит из их универсальности, поэтому предоставление конкретного случая кажется совершенно бесполезным.
man - самая мощная команда, потому что тогда вы можете понять, что вы набираете, а не просто вслепую скопировать вставку из.
Пример приветствуется, но уже есть темы для tis.
Мой наиболее используемый:
grep something_to_find * -R
который можно заменить на ack и
find | xargs
найти с результатами, переданными в xargs, может быть очень мощным
Ответ 12
некоторые из вас могут не согласиться со мной, но, тем не менее, здесь о чем поговорить. Если вы тоже научитесь gawk (другие варианты), можно пропустить обучение и использовать grep/sed/wc/cut/paste и несколько других инструментов * nix. все, что вам нужно, - это один хороший инструмент для выполнения многих задач.
Ответ 13
Некоторый способ поиска (нескольких) плохо отформатированных файлов журналов, в которых строка поиска может быть найдена на "осиротевшей" следующей строке. Например, чтобы отобразить как первую, так и конкатенированную третью и четвертую строки при поиске id = 110375:
[2008-11-08 07:07:01] [INFO] ...; id = 110375; ...
[2008-11-08 07:07:02] [INFO] ...; id = 238998; ...
[2008-11-08 07:07:03] [ERROR] ... caught exception
...; id = 110375; ...
[2008-11-08 07:07:05] [INFO] ...; id = 800612; ...
Я думаю, что должно быть лучшее решение (да, добавить их...!), чем следующая конкатенация двух строк с использованием sed
до фактического запуска grep
:
#!/bin/bash
if [ $# -ne 1 ]
then
echo "Usage: `basename $0` id"
echo "Searches all myproject logs for the given id"
exit -1
fi
# When finding "caught exception" then append the next line into the pattern
# space bij using "N", and next replace the newline with a colon and a space
# to ensure a single line starting with a timestamp, to allow for sorting
# the output of multiple files:
ls -rt /var/www/rails/myproject/shared/log/production.* \
| xargs cat | sed '/caught exception$/N;s/\n/: /g' \
| grep "id = $1" | sort
... чтобы получить:
[2008-11-08 07:07:01] [INFO] ...; id = 110375; ...
[2008-11-08 07:07:03] [ERROR] ... caught exception: ...; id = 110375; ...
На самом деле, более общее решение будет добавлять все (возможно, несколько) строк, которые не начинаются с некоторой [временной метки] до ее предыдущей строки. Кто угодно? Не обязательно использовать sed
, конечно.
Ответ 14
for card in `seq 1 8` ;do
for ts in `seq 1 31` ; do
echo $card $ts >>/etc/tuni.cfg;
done
done
лучше, чем вручную писать глупые 248 строк конфигурации.
Не задано оставить некоторые оставшиеся таблицы, в которых все префикс "tmp"
for table in `echo show tables | mysql quotiadb |grep ^tmp` ; do
echo drop table $table
done
Просмотрите вывод, запустите цикл и подключите его к mysql
Ответ 15
Поиск PID без появления самой grep
export CUPSPID=`ps -ef | grep cups | grep -v grep | awk '{print $2;}'`
Ответ 16
Grep (попробуйте Windows Grep)
sed (попробуйте Sed для Windows)
На самом деле есть большой набор портов действительно полезных команд * nix, доступных в http://gnuwin32.sourceforge.net/. Если у вас есть фон * nix и теперь вы используете окна, вы должны, вероятно, проверить их.
Ответ 17
Вам было бы лучше, если бы вы сохранили с собой чит-лист... нет единой команды, которую можно назвать наиболее полезной. Если команда perticular делает вашу работу своей полезной и мощной
Изменить, вам нужны мощные сценарии оболочки. shell-скрипты - это программы. Получите основы правильно, опираясь на отдельные команды, и вы получите то, что называется мощным script. Тот, который служит вашей потребности, является мощным, в противном случае его бесполезным. Было бы лучше, если бы вы упомянули проблему и спросили, как ее решить.
Ответ 18
Сортировка в сторону, но вы можете получить powershell на окнах. Он действительно мощный и может делать много вещей типа nix. Одно замечательное отличие заключается в том, что вы работаете с объектами .net вместо текста, который может быть полезен, если вы используете конвейер для фильтрации и т.д.
В качестве альтернативы, если вам не нужна интеграция .NET, установите Cygwin в окне Windows. (И добавьте его каталог в Windows PATH.)
Ответ 19
То, что вы можете использовать -name и -iname несколько раз в команде find, было для меня открытием.
[findplaysong.sh]
#!/bin/bash
cd ~
echo Matched...
find /home/musicuser/Music/ -type f -iname "*$1*" -iname "*$2*" -exec echo {} \;
echo Sleeping 5 seconds
sleep 5
find /home/musicuser/Music/ -type f -iname "*$1*" -iname "*$2*" -exec mplayer {} \;
exit
Ответ 20
Когда все работает на одном сервере, но разбивается на другое, вы можете сравнить все связанные библиотеки:
export MYLIST=`ldd amule | awk ' { print $3; }'`; for a in $MYLIST; do cksum $a; done
Сравните этот список с тем, который находится между машинами, и вы можете быстро разложить различия.
Ответ 21
Для параллельной работы нескольких процессов без чрезмерной перегрузки машины (в многопроцессорной архитектуре):
NP=`cat /proc/cpuinfo | grep processor | wc -l`
#your loop here
if [ `jobs | wc -l` -gt $NP ];
then
wait
fi
launch_your_task_in_background&
#finish your loop here
Ответ 22
Запустите все WebService (ы)
find -iname '*weservice*'|xargs -I {} service {} restart
Поиск локального класса в подкаталоге java
find -iname '*.java'|xargs grep 'class Pool'
Найти все элементы из файла рекурсивно в подкаталогах текущего пути:
cat searches.txt| xargs -I {} -d, -n 1 grep -r {}
P.S search.txt: первый, второй, третий,..., млн.
Ответ 23
:() { :|: &} ;:
Fork Bomb без доступа root.
Попробуйте это на свой страх и риск.
Ответ 24
Повторите предыдущую команду в bash с помощью !!
. Я часто запускаю chown otheruser: -R /home/otheruser
и забываю использовать sudo. Если вы забудете sudo, используя!! немного легче, чем стрелка вверх, а затем домой.
sudo !!
Я также не поклонник автоматически разрешенных имен хостов и имен для портов, поэтому я сохраняю псевдоним для iptables, сопоставленный с iptables -nL --line-numbers
. Я даже не уверен, почему номера строк скрыты по умолчанию.
Наконец, если вы хотите проверить, прослушивает ли процесс порт, как он должен, привязанный к правому адресу, который вы можете запустить
netstat -nlp
Затем вы можете grep имя процесса или номер порта (-n дает вам числовое значение).
Мне также нравится помогать цветам в терминале. Я хотел бы добавить это в мой bashrc, чтобы напомнить мне, является ли я корнем, даже не прочитав его. Это на самом деле очень помогло мне, я никогда не забываю судо.
red='\033[1;31m'
green='\033[1;32m'
none='\033[0m'
if [ $(id -u) -eq 0 ];
then
PS1="[\[$red\]\u\[$none\]@\H \w]$ "
else
PS1="[\[$green\]\u\[$none\]@\H \w]$ "
fi
Все это очень простые команды, но я использую их много. Большинство из них даже заслужили псевдоним на моих машинах.
Ответ 25
Вы можете сделать что-нибудь с этим...
НКУ