这是程序员的第一大美德。我们所有人都曾在某个时间或另一个时候使用一些一次性代码自动完成一项任务。有时需要几秒钟才能完成一个单行,有时我们会花费大量时间自动完成一个两秒钟的任务,然后再也不使用它了。
您发现哪些小技巧足以重复使用?竟然给自己起了个别名?
注意:在回答之前,请检查以确保它不在使用 BASH或 perl/ruby 单行问题的常用命令行技巧中。
我今天在 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
}
这是一个过滤器,它将逗号放在标准输入中任何大数字的中间。
$ 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
这个脚本拯救了我的职业生涯!
几年前,我在一个客户端数据库上远程工作。我更新了一个货件以更改其状态。但是我忘记了 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)
我在各种 linuxes 下使用这个脚本来检查机器之间(或到 CD/DVD)之间的目录复制是否有效,或者复制(例如 ext3 utf8 文件名 -> 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
抱歉,手头没有确切的代码,但我编写了一个正则表达式,用于在 VS.Net 中搜索源代码,它允许我搜索评论中没有的任何内容。它在我正在从事的一个特定项目中非常有用,人们坚持认为注释掉代码是一种很好的做法,以防你想回去看看代码过去做了什么。
我有两个 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
我不必在 SQL 查询分析器中反复打开文件并运行它们,而是找到了制作批处理文件所需的语法,然后可以一次运行 100 个。哦,甜蜜的喜悦!从那以后我就一直用这个。
isqlw -S servername -d dbname -E -i F:\blah\whatever.sql -o F:\results.txt
在整个工作日中,我不断地从自己的桌面连接到各种 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 ..."
我也有很多我经常连接的服务器,但它们都在我的本地网络上。这个 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`
这可以追溯到我的 COBOL 时代,但我有两个通用的 COBOL 程序,一批和一个在线(大型机人员会知道这些是什么)。它们是一个程序的外壳,可以采用任何一组参数和/或文件,并在 IMS 测试区域中运行、批处理或执行。我对它们进行了设置,以便根据参数我可以访问文件、数据库(DB2 或 IMS DB),或者只是操作工作存储或其他任何东西。
这很棒,因为我可以测试该日期函数,而无需猜测或测试为什么会出现截断或为什么会出现数据库 ABEND。随着时间的推移,这些程序的规模越来越大,包括各种测试,并成为开发组的主要内容。每个人都知道代码所在的位置,并将它们包含在他们的单元测试中。这些程序变得如此庞大(大部分代码都被注释掉了测试),而且这些都是多年来人们贡献的。他们节省了这么多时间,解决了这么多分歧!
我编写了一个 Perl 脚本来映射依赖关系,而没有进入无限循环,对于我继承的遗留 C 程序......它也有一个菱形依赖问题。
我写了一个小程序,当我收到朋友的电子邮件时,它会在一个很少使用的电子邮件帐户上给我发电子邮件。
我写了另一个小程序,如果我的家庭 IP 发生变化,它会向我发送短信。
仅举几例。
多年前,我在 PERL 的自定义 Web 应用程序平台上构建了一套应用程序。一个很酷的功能是将 SQL 查询字符串转换为人类可读的句子,描述结果是什么。
代码相对较短,但最终效果很好。
我有一个你运行的小应用程序,它将 GUID 转储到剪贴板。您可以运行它 /noui 或不运行它。使用 UI,它是一个按钮,每次单击它时都会丢弃一个新的 GUID。没有它会丢弃一个新的然后退出。
我主要在 VS 中使用它。我将它作为外部应用程序并映射到快捷方式。我正在编写一个严重依赖 xaml 和 guid 的应用程序,所以我总是发现我需要将新的 guid 粘贴到 xaml 中......
任何时候我写一个聪明的列表理解或在 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"
我有 20 或 30 个这样的东西,因为一旦我在 Windows 中为我的标准控制台应用程序编写框架,我几乎可以放入任何我想要的逻辑,所以我得到了很多解决特定问题的这些小东西.
我想我现在经常使用的是一个控制台应用程序,它采用标准输入并根据将正则表达式与颜色匹配的 xml 配置文件对输出进行着色。我用它来查看构建中的日志文件。另一个是命令行启动器,因此我不会污染我的 PATH 环境变量,并且无论如何它都会超过某些系统的限制,即 win2k。