Самые мощные примеры команд или скриптов 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). Редактором по умолчанию является любая переменная среды " EDITOR ". Например: export EDITOR = / usr / bin / pico, который находится в ~/.profile под Mac OS X.
Ctrl+x Ctrl+e
Список всех запущенных сетевых подключений (включая приложение, к которому они принадлежат)
lsof -i -nP
Очистить историю поиска Терминала (Еще один из моих любимых)
history -c
25 ответов
Лучшие ответы от сообщества
Пройдите по дереву каталогов и распечатайте пути к любым файлам, которые соответствуют регулярному выражению:
find . -exec grep -l -e 'myregex' {} \; >> outfile.txt
Вызвать редактор по умолчанию (Nano / ViM)
(работает в большинстве систем Unix, включая Mac OS X). Редактором по умолчанию является любая переменная среды " EDITOR ". Например: export EDITOR = / usr / bin / pico, который находится в ~/.profile под Mac OS X.
Ctrl+x Ctrl+e
Список всех запущенных сетевых подключений (включая приложение, к которому они принадлежат)
lsof -i -nP
Очистить историю поиска Терминала (Еще один из моих любимых)
history -c
Я считаю, что 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's speaker
dd if=/dev/dsp | ssh -c arcfour -C username@host dd of=/dev/dsp
Как выйти из VI
: WQ
Сохраняет файл и прекращает страдания.
Альтернатива:wq
" является ":x
msgstr "сохранить и закрыть редактор vi.
- Grep
- AWK
- СЕПГ
- Perl
- находить
Мощь Unix заключается в его способности манипулировать текстовыми файлами и фильтровать данные. Конечно, вы можете получить все эти команды для Windows. Они просто не являются родными в ОС, как в Unix.
и возможность связывать команды вместе с конвейерами и т. д. Это может создавать чрезвычайно мощные отдельные строки команд из простых функций.
Я использую это так сильно, что на самом деле мне стыдно за себя. Удалите пробелы из всех имен файлов и замените их подчеркиванием:
[removespaces.sh]
#!/bin/bash
find . -type f -name "* *" | while read file
do
mv "$file" "${file// /_}"
done
Ваша оболочка - самый мощный инструмент, который у вас есть
- возможность писать простые циклы и т. д.
- понимание глобализации файлов (например, *.java и т. д.)
- возможность составлять команды через каналы, подоболочки. перенаправление и т. д.
Наличие такого уровня знаний оболочки позволяет вам делать огромные объемы в командной строке, без необходимости записывать информацию через временные текстовые файлы, копировать / вставлять и т. Д., А также использовать огромное количество служебных программ, которые позволяют нарезать / нарезать кубики данных,
Unix Power Tools покажет вам многое из этого. Каждый раз, когда я открываю свою копию, я нахожу что-то новое.
Если вы сделаете опечатку в длинной команде, вы можете запустить команду с заменой (в bash):
mkdir ~/aewseomeDirectory
вы можете видеть, что "awesome" введен неправильно, вы можете набрать следующее, чтобы повторно запустить команду с исправленной опечаткой
^aew^awe
затем выводит то, что подставил (mkdir ~/aweseomeDirectory
) и запускает команду. (не забудьте отменить ущерб, нанесенный неверной командой!)
Мой личный фаворит - команда lsof.
"lsof" может использоваться для вывода списка открытых файловых дескрипторов, сокетов и каналов. Я нахожу это чрезвычайно полезным, когда пытаюсь выяснить, какие процессы использовали какие порты / файлы на моей машине.
Пример: список всех интернет-соединений без разрешения имени хоста и без преобразования имени порта в порт.
lsof -i -nP
Команда 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
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.
При решении проблем с неисправными Linux-блоками, наиболее распространенной последовательностью клавиш, которую я печатаю, является alt+sysrq R E I S U B.
Сила этих инструментов (grep find, awk, sed) заключается в их универсальности, поэтому конкретный случай кажется совершенно бесполезным.
man - самая мощная команда, потому что тогда вы можете понять, что вы печатаете, а не просто слепо копировать вставку из переполнения стека.
Пример приветствуется, но уже есть темы для этого. Мои самые используемые:
grep something_to_find * -R
который может быть заменен на ack и
find | xargs
найти с результатами, переданными в xargs, может быть очень мощным
Повторите свою предыдущую команду в bash, используя !!
, Я часто бегаю chown otheruser: -R /home/otheruser
и забудьте использовать sudo. Если вы забыли sudo, используя!! это немного проще, чем стрелка вверх, а затем домой.
sudo !!
Я также не фанат автоматически разрешаемых имен хостов и имен для портов, поэтому я держу псевдоним для iptables, сопоставленный с iptables -nL --line-numbers
, Я даже не уверен, почему номера строк по умолчанию скрыты.
Наконец, если вы хотите проверить, прослушивает ли процесс порт как следует, привязанный к нужному адресу, который вы можете запустить
netstat -nlp
Затем вы можете ввести имя процесса или номер порта (-n дает числовое значение).
Я также люблю иметь помощь цветов в терминале. Мне нравится добавлять это в мой bashrc, чтобы напомнить мне, являюсь ли я пользователем root, даже не читая его. Это на самом деле мне очень помогло, я никогда не забуду sudo.
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
Это все очень простые команды, но я часто их использую. Большинство из них даже заслужили псевдоним на моих машинах.
Некоторые из вас могут не согласиться со мной, но, тем не менее, есть о чем поговорить. Если кто-то изучает gawk (также и другие варианты) полностью, можно пропустить обучение и использовать grep / sed / wc / cut / paste и несколько других *nix инструментов. все, что вам нужно, это один хороший инструмент, чтобы сделать работу многих вместе взятых.
Поиск PID без отображения самого grep
export CUPSPID=`ps -ef | grep cups | grep -v grep | awk '{print $2;}'`
Какой-то способ поиска (нескольких) плохо отформатированных файлов журналов, в котором строку поиска можно найти в "потерянной" следующей строке. Например, чтобы отобразить как 1-ю, так и каскадную 3-ю и 4-ю строку при поиске 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's 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
, конечно.
Grep (попробуйте Windows Grep)
sed (попробуйте Sed для Windows)
На самом деле, на http://gnuwin32.sourceforge.net/ имеется большой набор портов действительно полезных команд *nix. Если у вас есть *nix фон и теперь вы используете окна, вам, вероятно, стоит их проверить.
Для параллельного запуска нескольких процессов без чрезмерной перегрузки машины (в многопроцессорной архитектуре):
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
В некотором роде, но вы можете получить PowerShell на Windows. Он действительно мощный и может делать много вещей типа *nix. Одним из отличительных отличий является то, что вы работаете с объектами.net вместо текста, что может быть полезно, если вы используете конвейер для фильтрации и т. Д.
В качестве альтернативы, если вам не нужна интеграция.NET, установите Cygwin на Windows. (И добавьте его каталог в ПУТЬ Windows.)
Тебе было бы лучше, если бы ты держал чит-лист с собой... нет единой команды, которую можно назвать наиболее полезной. Если команда perticular делает вашу работу полезной и мощной
Редактировать хотите мощные скрипты оболочки? Сценарии оболочки - это программы. Правильно составьте основы, постройте отдельные команды, и вы получите то, что называется мощным скриптом. Тот, который служит вашим потребностям, могущественен, иначе бесполезен. Было бы лучше, если бы вы упомянули проблему и спросили, как ее решить.
Запустить все веб-сервисы
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 {}
PS search.txt: первый, второй, третий, ..., миллион
Тот факт, что вы можете использовать -name и -iname несколько раз в команде поиска, открыл мне глаза.
[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
Когда что-то работает на одном сервере, но не работает на другом, следующее позволяет сравнить все связанные библиотеки:
export MYLIST=`ldd amule | awk ' { print $3; }'`; for a in $MYLIST; do cksum $a; done
Сравните этот список со списком между машинами, и вы сможете быстро выделить различия.