Nano hacks:您编写或遇到的最有用的小程序

时间:2008-10-07 00:49:17

标签: scripting automation

这是程序员的第一个great virtue。我们所有人都曾经在一次或另一次自动化任务中使用一些丢弃代码。有时需要几秒钟才能完成单线程,有时候我们花费了大量的时间来自动完成两秒钟的任务,然后再也不会再使用它了。

你发现什么微小的黑客对重用有用?为了制作一个别名?

注意:在回答之前,请检查以确保它不在favourite command-line tricks using BASH或perl / ruby​​单行问题上。

15 个答案:

答案 0 :(得分:13)

我今天在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
}

答案 1 :(得分:5)

这是一个过滤器,它将逗号放在标准输入中的任何大数字的中间。

$ 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

答案 2 :(得分:3)

这个剧本挽救了我的职业生涯!

几年前,我在客户端数据库上远程工作。我更新了货件以更改其状态。但我忘记了where子句。

当我看到(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)

答案 3 :(得分:2)

我在各种linux下使用这个脚本检查机器(或CD / DVD)之间的目录复制是否有效或复制(例如ext3 utf8文件名 - &gt; 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

答案 4 :(得分:1)

很抱歉,没有准确的代码,但我编写了一个正则表达式,用于在VS.Net中搜索源代码,这样我就可以搜索任何不在评论中的内容。它在我正在开发的一个特定项目中非常有用,人们坚持认为注释代码是一种很好的做法,以防你想回去查看代码的用途。

答案 5 :(得分:1)

我有两个ruby脚本,我会定期修改以下载所有各种webcomics。非常方便! 注意:它们需要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

答案 6 :(得分:1)

我没有必要在SQL查询分析器中重复打开文件并运行它们,而是找到了制作批处理文件所需的语法,然后可以一次运行100。哦甜蜜的快乐!从那以后我就用过这个。

isqlw -S servername -d dbname -E -i F:\blah\whatever.sql -o F:\results.txt

答案 7 :(得分:0)

这可以追溯到我的COBOL时代,但我有两个通用的COBOL程序,一个批处理和一个在线程序(大型机人员会知道这些是什么)。它们是程序的shell,可以接受任何参数和/或文件集,并在IMS测试区域中运行,批处理或执行。我让他们设置,以便根据参数我可以访问文件,数据库(DB2或IMS DB)和/或只是操纵工作存储或其他。

这很棒,因为我可以测试该日期函数而无需猜测或测试为什么存在截断或为什么存在数据库ABEND。随着时间的推移,这些计划的规模不断扩大,包括各种测试,并成为开发组的主要内容。每个人都知道代码所在的位置,并将它们包含在单元测试中。这些程序变得如此之大(大部分代码都被注释掉了测试),这些都是人们多年来贡献的。他们节省了很多时间,解决了很多分歧!

答案 8 :(得分:0)

我编写了一个Perl脚本来映射依赖项,而不是进入无限循环,对于我继承的遗留C程序......也存在钻石依赖问题。

我写了一个小程序,当我收到朋友的电子邮件时,通过电子邮件发送给我,这是一个很少使用的电子邮件帐户。

我写了另一个小程序,如果我的家庭IP发生变化,就会给我发短信。

仅举几例。

答案 9 :(得分:0)

多年前,我在PERL的自定义Web应用程序平台上构建了一套应用程序。 一个很酷的功能是将SQL查询字符串转换为描述结果的人类可读句子。

代码相对较短,但最终效果不错。

答案 10 :(得分:0)

我有一个你运行的小应用程序,它将GUID转储到剪贴板中。您可以运行它/ noui或不运行它。使用UI,它是一个按钮,每次单击它时都会删除新的GUID。没有它会掉一个新的然后退出。

我主要在VS中使用它。我将它作为外部应用程序并映射到快捷方式。我正在编写一个严重依赖xaml和guids的应用程序,因此我总是发现我需要将新的guid粘贴到xaml ...

答案 11 :(得分:0)

任何时候我都会在python中编写一个聪明的列表理解或使用map / reduce。有这样一个:

if reduce(lambda x, c: locks[x] and c, locknames, True):
    print "Sub-threads terminated!"

我记得的原因是我自己想出来,然后在其他人的网站上看到完全相同的代码。现在 - 它可能会像:

if all(map(lambda z: locks[z], locknames)):
    print "ya trik"

答案 12 :(得分:0)

我有20或30个这样的东西,因为一旦我在Windows中编写了我的标准控制台应用程序的框架,我几乎可以放弃我想要的任何逻辑,所以我得到了很多这些小东西,解决具体问题。

我想我现在正在使用的是一个控制台应用程序,它采用标准输入并根据将正则表达式与颜色匹配的xml配置文件对输出进行着色。我用它来从构建中查看我的日志文件。另一个是命令行启动器,所以我不会污染我的PATH环境变量,它会超过某些系统的限制,即win2k。

答案 13 :(得分:0)

我经常在我的工作日从我自己的桌面连接到各种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 ..."

答案 14 :(得分:0)

我经常连接一堆服务器,但它们都在我的本地网络上。这个Ruby脚本打印出命令,为任何打开ssh的机器创建别名:

#!/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`