Нано хаки: самые полезные крошечные программы, которые вы написали или встречали - PullRequest
10 голосов
/ 07 октября 2008

Это первое великое достоинство программистов. Все мы в то или иное время автоматизировали задачу с небольшим количеством одноразового кода. Иногда требуется несколько секунд, чтобы выйти из однострочника, иногда мы тратим непомерное количество времени на автоматизацию двухсекундного задания, а затем никогда не используем его снова.

Какой крошечный хак вы нашли достаточно полезным, чтобы повторно использовать ? Чтобы сделать так далеко, чтобы сделать псевдоним для?

Примечание: перед ответом, пожалуйста, убедитесь, что он не отвечает на любимые трюки командной строки, используя BASH или perl / ruby ​​однострочные вопросы

Ответы [ 15 ]

13 голосов
/ 07 октября 2008

Я нашел это на dotfiles.org только сегодня. это очень просто, но умно. я чувствовал себя глупо из-за того, что сам не подумал об этом.

###
###   Handy Extract Program
###
extract () {
     if [ -f $1 ] ; then
         case $1 in
             *.tar.bz2)   tar xvjf $1        ;;
             *.tar.gz)    tar xvzf $1     ;;
             *.bz2)       bunzip2 $1       ;;
             *.rar)       unrar x $1     ;;
             *.gz)        gunzip $1     ;;
             *.tar)       tar xvf $1        ;;
             *.tbz2)      tar xvjf $1      ;;
             *.tgz)       tar xvzf $1       ;;
             *.zip)       unzip $1     ;;
             *.Z)         uncompress $1  ;;
             *.7z)        7z x $1    ;;
             *)           echo "'$1' cannot be extracted via >extract<" ;;
         esac
    else
         echo "'$1' is not a valid file"
    fi
}
5 голосов
/ 07 октября 2008

Вот фильтр, который ставит запятые в середине любых больших чисел при стандартном вводе.

$ cat ~/bin/comma
#!/usr/bin/perl -p

s/(\d{4,})/commify($1)/ge;

sub commify {
    local $_  = shift;
    1 while s/^([ -+]?\d+)(\d{3})/$1,$2/;
    return $_;
}

Я обычно использую его для длинных выходных списков больших чисел и устаю считать десятичные разряды. Теперь вместо того, чтобы видеть

-rw-r--r--   1 alester alester 2244487404 Oct  6 15:38 listdetail.sql

Я могу запустить это как ls -l | comma и посмотреть

-rw-r--r--   1 alester alester 2,244,487,404 Oct  6 15:38 listdetail.sql
3 голосов
/ 22 декабря 2008

Этот скрипт спас мою карьеру!

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

Я никогда не забуду ощущение в животе, когда я увидел (затронуто 6834 ряда). В основном я провел всю ночь, просматривая журналы событий и выясняя правильный статус всех этих поставок. Дерьмо!

Поэтому я написал скрипт (изначально в awk), который запускал транзакцию для любых обновлений и проверял строки, на которые влияют, перед фиксацией. Это предотвратило любые неожиданности.

Так что теперь я никогда не делаю обновления из командной строки, не пройдя такой скрипт. Вот оно (сейчас в Python):

import sys
import subprocess as sp
pgm = "isql"
if  len(sys.argv) == 1:
    print "Usage: \nsql sql-string [rows-affected]"
    sys.exit()
sql_str = sys.argv[1].upper()
max_rows_affected = 3
if len(sys.argv) > 2:
    max_rows_affected = int(sys.argv[2])

if sql_str.startswith("UPDATE"):
    sql_str = "BEGIN TRANSACTION\\n" + sql_str
    p1 = sp.Popen([pgm, sql_str],stdout=sp.PIPE,
            shell=True)
    (stdout, stderr) = p1.communicate()
    print  stdout
    # example -> (33 rows affected)
    affected = stdout.splitlines()[-1]
    affected = affected.split()[0].lstrip('(')
    num_affected = int(affected)
    if num_affected > max_rows_affected:
        print "WARNING! ", num_affected,"rows were affected, rolling back..."
        sql_str = "ROLLBACK TRANSACTION"
        ret_code = sp.call([pgm, sql_str], shell=True)
    else:
        sql_str = "COMMIT TRANSACTION"
        ret_code = sp.call([pgm, sql_str], shell=True)
else:
    ret_code = sp.call([pgm, sql_str], shell=True)
2 голосов
/ 07 октября 2008

Я использую этот сценарий в разных linux для проверки работоспособности копии каталога между компьютерами (или на CD / DVD) или копирования (например, ext3 utf8 filenames -> fusebl) k) имеет искаженные специальные символы в именах файлов.

#!/bin/bash
##  dsum Do checksums recursively over a directory.
##  Typical usage: dsum <directory>  > outfile

export LC_ALL=C  # Optional - use sort order across different locales

if [ $# != 1 ]; then echo "Usage: ${0/*\//} <directory>" 1>&2; exit; fi
cd $1 1>&2 || exit
#findargs=-follow    # Uncomment to follow symbolic links
find . $findargs -type f | sort | xargs -d'\n' cksum
1 голос
/ 14 октября 2008

Вместо того, чтобы многократно открывать файлы в SQL Query Analyzer и запускать их, я нашел синтаксис, необходимый для создания пакетного файла, и затем мог запустить 100 сразу. О, сладкая сладкая радость! Я использовал это с тех пор.

isqlw -S servername -d dbname -E -i F:\blah\whatever.sql -o F:\results.txt
1 голос
/ 07 октября 2008

У меня есть два сценария ruby, которые я регулярно изменяю, чтобы загрузить все различные веб-комиксы. Очень удобно! Примечание: им требуется wget, поэтому, вероятно, linux. Примечание2: прочитайте их перед тем, как попробовать, им нужно немного модифицировать каждый сайт. Загрузчик на основе даты:

#!/usr/bin/ruby -w

Day = 60 * 60 * 24

Fromat = "hjlsdahjsd/comics/st%Y%m%d.gif"

t = Time.local(2005, 2, 5)

MWF = [1,3,5]

until t == Time.local(2007, 7, 9)
  if MWF.include? t.wday
    `wget #{t.strftime(Fromat)}`
    sleep 3
  end

  t += Day
end

Или вы можете использовать номер на основе:

#!/usr/bin/ruby -w

Fromat = "http://fdsafdsa/comics/%08d.gif"
1.upto(986) do |i|
  `wget #{sprintf(Fromat, i)}`
  sleep 1
end
1 голос
/ 07 октября 2008

Извините, у меня нет точного кода, но я написал регулярное выражение для поиска исходного кода в VS.Net, которое позволило мне искать что-либо, кроме комментариев. Он оказался очень полезным в конкретном проекте, над которым я работал, когда люди настаивали на том, что комментирование кода является хорошей практикой, на случай, если вы захотите вернуться и посмотреть, что код делал.

0 голосов
/ 07 ноября 2008

У меня также есть несколько серверов, к которым я часто подключаюсь, но все они находятся в моей локальной сети. Этот скрипт Ruby выводит команду для создания псевдонимов для любой машины с ssh open:

#!/usr/bin/env ruby

require 'rubygems'
require 'dnssd'

handle = DNSSD.browse('_ssh._tcp') do |reply|
  print "alias #{reply.name}='ssh #{reply.name}.#{reply.domain}';"
end

sleep 1
handle.stop

Используйте это в своем .bash_profile:

eval `ruby ~/.alias_shares`
0 голосов
/ 02 ноября 2008

В течение рабочего дня я постоянно подключаюсь к различным серверам Linux со своего рабочего стола, поэтому я создал несколько псевдонимов, которые будут запускать xterm на этих машинах и устанавливать заголовок, цвет фона и другие настройки: *

alias  x="xterm"         # local
alias xd="ssh -Xf me@development_host xterm -bg aliceblue -ls -sb -bc -geometry 100x30 -title Development"
alias xp="ssh -Xf me@production_host  xterm -bg thistle1 ..."
0 голосов
/ 07 октября 2008

У меня есть 20 или 30 таких вещей, потому что, как только я закодировал фреймворк для моего стандартного консольного приложения в Windows, я могу в значительной степени отказаться от любой логики, которую захочу, так что я получил много таких маленьких решить конкретные проблемы.

Полагаю, что сейчас я часто использую консольное приложение, которое принимает стандартный ввод и раскрашивает вывод на основе профилей xml, соответствующих регулярным выражениям и цветам. Я использую его для просмотра моих журналов из сборок. Другой - это средство запуска командной строки, поэтому я не загрязняю мою переменную PATH env, и в любом случае это превысит ограничение в некоторых системах, а именно в win2k.

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