Самые мощные примеры команд или скриптов Unix, которые должен знать каждый программист - PullRequest
27 голосов
/ 09 июля 2009

Есть много вещей, которые должны знать все программисты, но меня особенно интересуют команды Unix / Linux, которые мы все должны знать. Для выполнения задач, с которыми мы можем столкнуться в какой-то момент, таких как рефакторинг , отчеты , сетевые обновления и т. Д.

Мне любопытно, потому что, прежде чем я работал тестировщиком программного обеспечения в компании-разработчике программного обеспечения, пока я изучал свою степень, я заметил, что у всех разработчиков (которые разрабатывали программное обеспечение для Windows) было 2 компьютера.

Слева от них находилась машина для разработки Windows XP, а справа - коробка с Linux. Я думаю, что это была Ubuntu. Во всяком случае, они сказали мне, что использовали его, потому что он предоставлял мощные операции Unix, которые Windows не могла выполнить в процессе разработки.

Мне любопытно узнать, как инженер-программист, что, по вашему мнению, является одним из самых мощных сценариев / команд / применений, которые вы можете выполнять в операционной системе Unix / Linux, которые каждый программист должен знать для решения реальных задач что не обязательно относится к написанию кода?

Мы все знаем, что делают sed , awk и grep . Я заинтересован в некоторых реальных сценариях Unix / Linux, которые решили сложную проблему для вас, так что другие программисты могут получить выгоду. Пожалуйста, предоставьте свою историю и источник.

Я уверен, что есть множество подобных примеров, которые люди хранят в своей папке Scripts .

Обновление: Люди, кажется, неправильно истолковывают вопрос. Я не спрашиваю имена отдельных команд Unix, скорее код UNIX snippets , который решил проблему для вас.

Лучшие ответы от сообщества


Пройдите по дереву каталогов и распечатайте пути к любым файлам, которые соответствуют регулярному выражению:

find . -exec grep -l -e 'myregex' {} \; >> outfile.txt 

Вызовите редактор по умолчанию (Nano / ViM)

(работает на большинстве систем Unix, включая Mac OS X) Редактор по умолчанию любой Переменная окружения " EDITOR " установлен в. т.е.: экспорт РЕДАКТОР = / usr / bin / pico который находится в ~ / .profile под Mac OS X.

Ctrl+x Ctrl+e

Список всех работающих сетевых подключений (включая приложение, к которому они принадлежат)

lsof -i -nP

Очистить историю поиска Терминала (Еще один из моих любимых)

history -c

Ответы [ 25 ]

19 голосов
/ 09 июля 2009

Я считаю 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
13 голосов
/ 13 июля 2009

Как выйти из VI

: WQ

Сохраняет файл и прекращает страдания.

Альтернативой «:wq» является «:x» для сохранения и закрытия редактора vi.

8 голосов
/ 09 июля 2009
  • grep
  • awk
  • сед
  • Perl
  • найти

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

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

4 голосов
/ 13 июля 2009

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

[removespaces.sh]

#!/bin/bash
find .  -type f -name "* *" | while read file
do
   mv "$file" "${file// /_}"
done
4 голосов
/ 09 июля 2009

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

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

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

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

3 голосов
/ 10 июля 2009

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

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

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

lsof -i -nP

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

3 голосов
/ 13 июля 2009

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

mkdir ~/aewseomeDirectory

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

^aew^awe

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

2 голосов
/ 13 июля 2009

Команда 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
1 голос
/ 10 июля 2009
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

1 голос
/ 09 июля 2009

Некоторый способ поиска (нескольких) плохо отформатированных файлов журналов, в котором строка поиска может быть найдена в "потерянной" следующей строке. Например, для отображения как 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, конечно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...