Самые мощные примеры команд или скриптов 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" является ":xmsgstr "сохранить и закрыть редактор vi.

  • Grep
  • AWK
  • СЕПГ
  • Perl
  • находить

Мощь Unix заключается в его способности манипулировать текстовыми файлами и фильтровать данные. Конечно, вы можете получить все эти команды для Windows. Они просто не являются родными в ОС, как в Unix.

и возможность связывать команды вместе с конвейерами и т. д. Это может создавать чрезвычайно мощные отдельные строки команд из простых функций.

Я использую это так сильно, что на самом деле мне стыдно за себя. Удалите пробелы из всех имен файлов и замените их подчеркиванием:

[removespaces.sh]

#!/bin/bash
find .  -type f -name "* *" | while read file
do
   mv "$file" "${file// /_}"
done

Ваша оболочка - самый мощный инструмент, который у вас есть

  1. возможность писать простые циклы и т. д.
  2. понимание глобализации файлов (например, *.java и т. д.)
  3. возможность составлять команды через каналы, подоболочки. перенаправление и т. д.

Наличие такого уровня знаний оболочки позволяет вам делать огромные объемы в командной строке, без необходимости записывать информацию через временные текстовые файлы, копировать / вставлять и т. Д., А также использовать огромное количество служебных программ, которые позволяют нарезать / нарезать кубики данных,

Unix Power Tools покажет вам многое из этого. Каждый раз, когда я открываю свою копию, я нахожу что-то новое.

Если вы сделаете опечатку в длинной команде, вы можете запустить команду с заменой (в bash):

mkdir ~/aewseomeDirectory

вы можете видеть, что "awesome" введен неправильно, вы можете набрать следующее, чтобы повторно запустить команду с исправленной опечаткой

^aew^awe

затем выводит то, что подставил (mkdir ~/aweseomeDirectory) и запускает команду. (не забудьте отменить ущерб, нанесенный неверной командой!)

Мой личный фаворит - команда lsof.

"lsof" может использоваться для вывода списка открытых файловых дескрипторов, сокетов и каналов. Я нахожу это чрезвычайно полезным, когда пытаюсь выяснить, какие процессы использовали какие порты / файлы на моей машине.

Пример: список всех интернет-соединений без разрешения имени хоста и без преобразования имени порта в порт.

lsof -i -nP

http://www.manpagez.com/man/8/lsof/

Команда 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

Сравните этот список со списком между машинами, и вы сможете быстро выделить различия.

Вы можете сделать что-нибудь с этим...

НКУ

Другие вопросы по тегам