Chinaunix首页 | 论坛 | 博客
  • 博客访问: 623470
  • 博文数量: 138
  • 博客积分: 3067
  • 博客等级: 中校
  • 技术积分: 1565
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-21 12:44
文章分类

全部博文(138)

文章存档

2016年(5)

2014年(4)

2012年(1)

2011年(2)

2010年(10)

2009年(19)

2008年(97)

我的朋友

分类:

2008-08-13 15:14:34

转自:http://blog.chinaunix.net/u/6913/showart_27858.html
shell技巧
用自动导入函数的方法,可以在命令行下像执行命令一样快捷,而且速度快,占用资源少.
1,建立自己的函数库
mkdir functionlib
然后将常用的脚本改成函数的语法,如:
function filename { command ; }
将filename拷贝到functionlib中,
2,修改环境文件,在/etc/profile中添加
export FPATH=$HOME/functionlib
3,重登录一下
这样的话,你就可以随时用像ls那样运行你自己的filename"命令"
而不需要用什么dot,sh,来运行你的函数/脚本啦~~
如果在脚本中运行,可以在脚本顶部用
#!/bin/sh
##
autoload filename //来自动导入函数.
...
filename //调用函数
...
用自动导入函数的方法,可以在命令行下像执行命令一样快捷,而且速度快,占用资源少.
1,建立自己的函数库
mkdir functionlib
然后将常用的脚本改成函数的语法,如:
function filename { command ; }
将filename拷贝到functionlib中,
2,修改环境文件,在/etc/profile中添加
export FPATH=$HOME/functionlib
3,重登录一下
这样的话,你就可以随时用像ls那样运行你自己的filename"命令"
而不需要用什么dot,sh,来运行你的函数/脚本啦~~
如果在脚本中运行,可以在脚本顶部用
#!/bin/sh
##
autoload filename //来自动导入函数.
...
filename //调用函数
...
技巧:pkill的妙用


有的时候有很多进程或运行或睡眠或僵死,占用了很多宝贵的内存空间,kill固然可以杀掉某些进程,但更好的方法是用pkill,举例:
代码:
root//root>ps -A
PID TTY TIME CMD
...
1045 ? 00:00:00 kdeinit
1052 ? 00:00:00 kdeinit
1054 pts/0 00:00:00 xterm
1056 pts/1 00:00:00 bash
1082 pts/0 00:00:00 ps

root//root>free
total used free shared buffers cached
Mem: 252340 212036 40304 0 5752 103200
-/+ buffers/cache: 103084 149256
Swap: 610460 0 610460

root//root>pkill -9 xterm;free
[1]+ Killed xterm
total used free shared buffers cached
Mem: 252340 210776 41564 0 5760 103200
-/+ buffers/cache: 101816 150524
Swap: 610460 0 610460

在我杀掉了xterm这个进程后,看看你的free内存空间相应增加不少?.
详细使用方法请:
man pkill or pkill --help
用stty和dd实现暂停,只须按一个键就可.
#!/bin/ksh
#
function char {
settty=$(stty -g)
stty raw
dd if=/dev/tty bs=1 count=1 2> /dev/null
stty -raw
stty $settty
}
print "Press any key to continue..."
input=$(char)
技巧:如何检查用户的输入?


有的时候,我们对用户的输入要作必要的检测,如,限制输入的长度/类型.举例说明:
代码:
#!/bin/ksh
#要求用户必须输入四个数字
while true
do
echo -n "请输入四个数字:"
read num
len=${#num}
#变量len存放输入的长度
if [[ $num != [0-9][0-9][0-9][0-9] || $len != 4 ]] then
#进行检测,如果你输入有非数字字符,或者长度不等于四个,便提示错误信息
echo "错误! 重新输入"
continue
else
echo "输入正确,退出!";exit 0
fi
done

这是个例子,在我们编写脚本中可以借鉴
shell变量传递给sed,awk,grep简单方法


有时候在脚本编写中,需要往诸如awk等工具中传递shell的变量,举个简单的例子,如:
ps -aux|sed -n 1p
read input?"please field number your want to see:"
ps -aux|awk '{print $"'${input}'"}'
read enter?"please line number your want to see:"
ps -aux|sed -n ${enter}p
read user?"please username your want to see:"
ps -aux|grep $user
注:上述文件无实际意义,只为说明而已.
开启小键盘数字灯的方法


在man setleds的描述中,有一段设置字符控制台数字灯的脚本:
代码:
INITTY=/dev/tty[1-8]
for tty in $INITTY
do
setleds -D +num < $tty
done

把它放在/etc/rc.d/rc.local文件中即可!这样就可以像WIN一样一启动系统,它的小键盘的数字灯总是打开的!
在字符模式下,也可以这样:
setleds -D +num/+caps/+scroll
技巧:把输入的密码变成*号的方法


注:此贴转自:
代码:
#!/bin/sh 
getchar() {
stty cbreak -echo
dd if=/dev/tty bs=1 count=1 2> /dev/null
stty -cbreak echo
}
printf "Please input your passwd: "
while : ; do
ret=`getchar`
if [ -z $ret ]; then
echo
break
fi
str="$str$ret"
printf "*"
done
echo "Your password is: $str"
技巧:数值转换


代码:
#!/bin/bash
#scriptname:conver
#在BASH下简单实现十进制到二进制和十六进制的转换
cat<1] 10=>2 2] 10=>16
info
read input?"please enter your choice:"
case $input in
1) echo -n "please a dec number:";read i1
echo "$i1==$(echo "obase=2;$i1"|bc)" ;;
2) echo -n "please a dec number:";read i2
echo "$i2==$(echo "obase=16;$i2"|bc)" ;;
*) echo "wrong choice!"
exit 1 ;;
esac
技巧:统计文本中单词数量的方法


有些单词在一篇文章中经常会出现很多次,怎么统计这个单词的个数呢?!
如:文件kshfile,统计shell这个单词的个数,
$cat kshfile
ksh
The "Korn" shell, written by David Korn of AT&T Bell Labs (now Lucent). Written as a major upgrade to "sh", it is compatible with it, but has many more internal commands for the most frequently used functions. It also incorporates most of the same features from tcsh which enhance interactive use (command line history recall etc.). This shell is now available on most systems. It was slow
to gain acceptance because earlier versions were encumbered by AT&T licensing.
$cat kshfile|tr " " " "|grep -wc shell
2
技巧:显示文本奇数偶数的方法


[javalee//home/javalee/myshell]cat tmp
aaaaaa
dddddd
kasdkfkk
djhasdjf
dfddf
kjsdfklkls
asdfjklkas
#显示文件tmp的奇数行的内容:
[javalee//home/javalee/myshell]sed -n '1,$p;n' tmp
aaaaaa
kasdkfkk
dfddf
asdfjklkas
#显示文件tmp的偶数行的内容:
[javalee//home/javalee/myshell]sed -n '1,$n;p' tmp
dddddd
djhasdjf
kjsdfklkls
技巧:倒读文本


例如文章:
$cat -n tmp
1 abcdefgh
2 123234234
3 sjdfk23423
1,行号倒序:
$cat -n tmp|tac #tac和cat很有趣吧~~
3 sjdfk23423
2 123234234
1 abcdefgh
2,每行倒读:
$cat tmp|rev
hgfedcba
432432321
32432kfdjs
3,全部倒过来:
$cat -n tmp|rev|tac
32432kfdjs 3
432432321 2
hgfedcba 1
4,用sed也可以解决要求对sed有足够的理解)
$cat -n tmp|sed '/ /!G;s/(.)(.* )/&21/;//D;s/.//'
hgfedcba 1
432432321 2
32432kfdjs 3
技巧:把汉字转换成十六进制和二进制的方法


命令行下,利用perl的unpack函数,可以将汉字巧妙的变成十六进制和二进制,如:
[javalee//home/javalee/myshell]perl -le 'print unpack("B*","中");' #把汉字"中"转换成二进制
1101011011010000
[javalee//home/javalee/myshell]perl -le 'print unpack("H*","国");' #把汉字"国"转换成十六进制
b9fa
技巧:妙用watch命令实时观察内存变化


在linux中,有一个很有趣的命令--watch,他的作用很有趣!
他作用是以全屏幕方式重复地执行指定的命令,用户可以通过他了解命令的运行情况.
如,我们要观察内存动态的变化,那么就可以:
watch free
这样就可以动态的观察内存中各个指标在指定时间内的变化啦~~,
如要观察虚拟内存的变化,也可以通过打开另外一个终端,而不耽误当前终端的操作!:
xterm -e watch -n 1 vmstat &
这样就会弹出一个xterm,显示有关虚拟内存的情况.
详细解释,请:
watch --help
man watch

技巧: 用 tr 过滤文件[转贴]


了解文本实用程序

Jacek Artymiak(jacek@artymiak.com)
自由作家和顾问
2003 年 7 月

没有人曾说过 sed 很容易 - 它确实不容易!但通过使用 tr,您可以非常容易地实现 sed 的许多最基本功能。Jacek Artymiak 向您展示如何去做。

您可以将 tr 看作为 sed 的(极其)简化的变体:它可以用一个字符来替换另一个字符,或者可以完全除去一些字符。您也可以用它来除去重复字符。这就是所有 tr 所能够做的。


那 么,为什么要使用 tr,而不使用 sed 呢?当然是为了使事情简单。例如,如果我们希望用字母"z"来替换出现的所有字母"a",则可以用 tr a z,这条命令毫无疑问比 sed -e s/a/z/g 简单,尤其在把它用到脚本中时,其中的引号转义很让人头痛。另外,在使用 tr 时,可以避免写那些让人讨厌的正则表达式。


使用 tr 很简单:使用前面一段中所给出的符号表示法,用一个字符去替换出现的所有另一个字符。当需要替换多个字符时,使用类似于这样的表示法:tr abc xyz,它表示用字母"x"去替换出现的所有字母"a",用字母"y"去替换所有字母"b",用字母"z"去替换所有字母"c"。这两组中所列出的字符的 数目不必相等。


您也可以指定字符的范围。例如,tr a-z A-Z 将用对应的大写字母来替换所有的小写字母(例如,它将"no smoking"转换成"NO SMOKING")。当您在 vi 编辑器中想强调正在编辑的文本的某一部分时,使用这一特殊技巧非常方便。只要按一下 Escape 键,然后按 : 键,再输入 2,4!tr 'a-z' 'A-Z',最后按一下 Return 键。现在,从第 2 行到第 4 行的字母就都转换成了大写字母。


关于 tr 的其它内容
GNU 手册上提到,tr 在执行您所选择的操作时,通过将标准输入复制到标准输出,从而实现"转换、压缩和/或删除字符"。在这篇技巧文章中,您将了解到这些选项;当然也可以通过了解 tr 的手册页或信息页,学习到更多关于 tr 的内容。

打开一个新的终端窗口,输入 man tr 或 info tr - 或者打开一个新的浏览器窗口,并链接到 gnu.org 上的 tr 手册页(关于这个链接,请参阅参考资料)。



另 外,当有人给您发送了一个在 Mac OS 或 DOS/Windows 机器上创建的文本文件时,您会发现 tr 非常有用。如果没有将文件保存为使用 UNIX 换行符来表示行结束这种格式,则需要将这样的文件转换成本机 UNIX 格式,否则一些命令实用程序不会正确地处理这些文件。Mac OS 的行尾以回车字符结束,许多文本处理工具将这样的文件作为一行来处理。为了纠正这个问题,可以用下列技巧:

Mac -> UNIX:tr ' ' ' ' < macfile > unixfile
UNIX -> Mac:tr ' ' ' ' < unixfile > macfile

Microsoft DOS/Windows 约定,文本的每行以回车字符并后跟换行符结束。为了纠正这个问题,可以使用下列命令:

DOS -> UNIX:tr -d ' ' < dosfile > unixfile
UNIX -> DOS:在这种情况下,需要用 awk,因为 tr 不能插入两个字符来替换一个字符。要使用的 awk 命令为 awk '{ print $0" " }' < unixfile > dosfile

另外,当您需要对文本文件做一些简单的整理工作(如用 tr -d ' ' 除去制表符,用 tr -s ' ' 除去多余的空格,或者用 tr -d ' ' 将分开的几行合成一行)时,会需要用 tr。同样,可以在 vi 内使用所有这些命令;只要记住:在 tr 命令前要加上您希望处理的行范围和感叹号(!),如 1,$!tr -d ' '(美元符号表示最后一行)中所示。

技巧:删除文件中空行的几种方法


1,cat filename|tr -s ' '
2,sed '/^$/d' filename
3,awk '{if($0!="")print}' filename
4,用grep也可以,但是比较麻烦
技巧:如何判断输入的是字符还是数字的三个方法


1,用输入的字符串和任意一个数字进行运算,可以判断!
代码:
#!/bin/ksh 
#
var=$(echo "$1*1"|bc)
if [[ $var != 0 ]]
then
echo "$1 is a number"
else
echo "$1 is a charter"
fi

2,用流编辑器sed!
代码:
if [ -n "`echo $1|sed -n '/^[0-9][0-9]*$/p'`" ] 
then
echo "$1 is number!"
else
echo "$1 is not number!"
fi

3,用awk来判断!
代码:
echo $1|awk '{if($0~/[^0-9]/) {print "'$1' is not number"} else{print "'$1' is number"}}'
技巧:用 uniq 除去重复行[转]


作者:Jacek Artymiak(jacek@artymiak.com)自由作家和顾问 2003 年 7 月

重复行通常不会造成问题,但是有时候它们的确会引起问题。此时,不必花上一个下午的时间来为它们编制过滤器,uniq 命令便是唾手可得的好工具。了解一下它是如何节省您的时间和精力的。

进行排序之后,您会发现有些行是重复的。有时候该重复信息是不需要的,可以将它除去以节省磁盘空间。不必对文本行进行排序,但是您应当记住 uniq 在读取行时会对它们进行比较并将只除去两个或更多的连续行。下面的示例说明了它实际上是如何工作的:

清单 1. 用 uniq 除去重复行

$ cat happybirthday.txt

Happy Birthday to You!

Happy Birthday to You!

Happy Birthday Dear Tux!

Happy Birthday to You!


$ sort happybirthday.txt

Happy Birthday Dear Tux!

Happy Birthday to You!

Happy Birthday to You!

Happy Birthday to You!


$ sort happybirthday.txt | uniq

Happy Birthday Dear Tux!

Happy Birthday to You!

警告:请不要使用 uniq 或任何其它工具从包含财务或其它重要数据的文件中除去重复行。在这种情况下,重复行几乎总是表示同一金额的另一个交易,将它除去会给会计部造成许多困难。千万别这么干!

有关 uniq 的更多信息
本系列文章介绍了文本实用程序,它对在手册页和信息页找到的信息作了补充。如果您打开新的终端窗口并输入 man uniq 或 info uniq,或者打开新的浏览器窗口并查看位于 gnu.org 的 uniq 手册页,那么就可以了解更多的相关信息。

如果您希望您的工作轻松点,比如只显示唯一的或重复的行,那么该怎么办呢?您可以用 -u(唯一)和 -d(重复)选项来做到这一点,例如:

清单 2. 使用 -u 和 -d 选项

$ sort happybirthday.txt | uniq -u

Happy Birthday Dear Tux!


$ sort happybirthday.txt | uniq -d

Happy Birthday to You!



您还可以用 -c 选项从 uniq 中获取一些统计信息:

清单 3. 使用 -c 选项

$ sort happybirthday.txt | uniq -uc

1 Happy Birthday Dear Tux!


$ sort happybirthday.txt | uniq -dc

3 Happy Birthday to You!



就 算 uniq 对完整的行进行比较,它仍然会很有用,但是那并非该命令的全部功能。特别方便的是:使用 -f 选项,后面跟着要跳过的字段数,它能够跳过给定数目的字段。当您查看系统日志时这非常有用。通常,某些项要被复制许多次,这使得查看日志很难。使用简单的 uniq 无法完成任务,因为每一项都以不同的时间戳记开头。但是如果您告诉它跳过所有的时间字段,您的日志一下子就会变得更加便于管理。试一试 uniq -f 3 /var/log/messages,亲眼看看。

还有另一个选项 -s,它的功能就像 -f 一样,但是跳过给定数目的字符。您可以一起使用 -f 和 -s。uniq 先跳过字段,再跳过字符。如果您只想使用一些预先设置的字符进行比较,那么该怎么办呢?试试看 -w 选项。

技巧:限时输入的实现


举例:
代码:
#!/bin/ksh
stty -icanon min 0 time 100 <=限定时间为10秒
while
do
echo "Please input:y/m/d/[ENTER]:" <=输入字母y,m,d或者回车
read input
case $input in
y) date +%Y;break;;
m) date +%m;break;;
d) date +%d;break;;
"") date +%Y/%m/%d;break;; <=当输入为空(回车)或者10秒钟内没有输入的话,取设定的默认值.
*) echo "wrong!again!";continue;;
esac
done
stty sane


技巧:查找特定字符所在行行号的方法


方法很多,介绍一下3个具有代表性的,
1,grep -n "string" filename
2,sed -n '/string/=' filename
3,awk '/string/{print FNR}' filename
当然,和nl配合使用效果基本一致!

在shell里进行算术运算常用的3种方法


1,expr
expr 1 + 2 #注意空格
2,(())
((n=1+2))
3,bc
echo "1+2"|bc #优点可以取小数点的位数
4,
echo $[1+2]
隐藏回显的另一法


除了用stty -echo来禁止显示诸如密码之类的方法外,也可以尝试这样
代码:
echo -n "please input password:\033[8m"
read input
echo -n
awk技巧两则


1,查找一个关键词在整个文件中出现的次数
代码:
awk '/keyword/{count++}END{print count }' filename

2,替换
代码:
awk '{gsub(/oldstr/,"newstr");print}' filename
技巧:从键盘输入生成文件的若干方法


1,用echo,如:
代码:
echo "some strings ">filename

2,用here文档,如:
代码:
/home/javalee#cat <filename
>some strings
>!
#CTR+D退出
3,用dd命令,如:
代码:
/home/javalee#dd filename 2>/dev/null
#CTR+D退出
4,用while循环,如:
代码:
/home/javalee#while read i;do echo $i >>filename;done
#CTR+D退出
5,用read:如:
代码:
/home/javalee#while true;do read;echo $REPLY >>filename;[[ -z $REPLY ]]&&break;done
技巧:用grep提取网址/链接的方法


代码:
grep -o 'http://[a-zA-Z0-9./?=%_~]*' urlfile 

感兴趣的话大家可以测试一下
grep version:
grep (GNU grep) 2.5.1
grep对-o选项的解释:
-o, --only-matching show only the part of a line matching PATTERN
阅读(1876) | 评论(0) | 转发(1) |
0

上一篇:sed

下一篇:BAT 讲解

给主人留下些什么吧!~~