免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1678 | 回复: 0
打印 上一主题 下一主题

shell技巧 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-05-26 14:36 |只看该作者 |倒序浏览
用自动导入函数的方法,可以在命令行下像执行命令一样快捷,而且速度快,占用资源少.
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 [color="#ff0000"]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      [color="#ff0000"]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      [color="#ff0000"]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
把它放在/etc/rc.d/rc.local文件中即可!

这样就可以像WIN一样一启动系统,它的小键盘的数字灯总是打开的!
在字符模式下,也可以这样:
setleds -D +num/+caps/+scroll技巧:把输入的密码变成*号的方法
注:此贴转自:
[color="#000000"]WWW.CHINAUNIX.NET
代码:#!/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下简单实现十进制到二进制和十六进制的转换
cat2       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" [color="#ff0000"]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 [color="#ff0000"]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
[color="#ff0000"]2[color="#ff0000"]技巧:显示文本奇数偶数的方法
[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 '' '
'  unixfile
UNIX -> Mac:tr '
' ''  macfile
Microsoft DOS/Windows 约定,文本的每行以回车字符并后跟换行符结束。为了纠正这个问题,可以使用下列命令:
DOS -> UNIX:tr -d ''  unixfile
UNIX -> DOS:在这种情况下,需要用 awk,因为 tr 不能插入两个字符来替换一个字符。要使用的 awk 命令为 awk '{ print $0"" }'  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   
技巧:查找特定字符所在行行号的方法
方法很多,介绍一下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
[url=file://\033[0m]\033[0m[/url]
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

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/6913/showart_27858.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP