1、Unix命令及文本SHELL的处理,陈金忠 2009-9-17,Unix常用命令说明,本节主要说明我们日常要用到的Unix命令: 简单的命令不在说明: ls、pwd、mkdir、cd、rm、more、head、tail、cp 常用命令说明: man 主要显示Unix命令在线帮助。例如: man pwd which 主要显示Unix命令所在位置例如: which pwd,crontab 系统自动运行配置命令。-e 编辑-l 列出-r 删除 时程表的格式如下 : f1 f2 f3 f4 f5 program 其中f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5
2、表示一个星期中的第几天。program 表示要执行的程序。 当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程序,其馀类推 当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其馀类推 当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其馀类推 当 f1 为 a, b, c,. 时表示第 a, b, a, b, c.个小时要执行,其馀类推c,. 分钟要执行,f2 为 a, b, c,. 时表示第,sort 对文
3、件记录进行排序,或选择文件中部分记录进行排序。例如:对文件记录进行排序,并输出到文件中。sort data.txt data.txt.sort例如:对文件记录进行排序,并取除重复记录。sort u data.txt data.txt.sort例如:文件记录用逗号分隔,并按1段和第3段排序。sort -t, +0 +2 test.1例如:文件用逗号分隔,并按1段的第2位和第3段排序。sort -t, +0.1 -0.6 +2 test.1sort -t, +0.1 -0.2 +2n test.1例如:指定排序临时文件目录。sort -T /home/yunying/_liaogx/_test -
4、t, +0 +2 test.1,comm比较命令,对二个排序文件进行比较可以得到相同和差异部分。例如:对二个文件进行比较,找出相同部分。comm -12 file1 file2例如:对二个文件进行比较,找出只在文件1中独有的。comm -23 file1 file2例如:对二个文件进行比较,找出只在文件2中独有的。comm -13 file1 file2,uniq从排序文件中找出重复记录,常用参数是c,d,u。例如:找出文件记录重复次数uniq c file 例如:只找出文件中重复的记录uniq d file例如:文件中重复的记录都不要。只显示不重复记录。uniq u file Find查找文
5、件,可以是正则表达式。例如:一个当前目录下的文件find . name test,grep过滤指定条件的文件记录,可以使用表达式。还有相同命令是egrep 和fgrep ,grep和egrep支持正则表达式。例如:过滤88开头的记录出来grep “88” file1例如:过滤出非88开头的记录出来grep v “88” file1例如:过滤出99结尾的行。grep “99$” file1例如:过滤出开头是8个数值的行。grep “0-98” file1例如:过滤文件中的空行。grep “$” file1,join将两个文件进行连接,按每个文件的第一字段为标准。例如:将两个逗号分隔的文件进行连接
6、,只显示相同记录。join -t, file file1例如:将两个逗号分隔的文件进行连接,只在第一个文件有的记录也显示出来。join a1 -t, file file1例如:只显示其中一个文件独有的记录。join v1 -t, file file1例如:选择两个文件中的部分记录连接并显示。join -t, -j1 1 -j2 4 file file1 #指定字段连接join -t, -j1 1 -j2 4 -o 1.2,1.3,2.3 file file1,sedsed是一个文本流编辑器,不会修改原文件,只是将原文件的副本输出到文件或屏幕。它可以进行删除、修改、替换操作。例如:查到一串数字1
7、89,只显示找到的。sed -n /189/p filesed -n /189/p file #查找189开头的行sed n /0-911/ p file #查找连续出显11个数字的行例如:对文件中的189全替换成ddddsed -n s/189/dddd/p filesed -n s/189/dddd/p file例如:将文件中含有189的记录都过滤掉。sed /189/d file,Test测试条件是否成立,一般用在判断语句中。 字符串条件: = ,!=, 整数比较:-eq (相等),-ge(大于等于),-gt (大于) ,-le (小于等于), -lt(小于),-ne (不等于) 例如:
8、检查目录下是否都是文件。#!/bin/sh for v_file in ls * doif -f $v_file ; then #如果then和if 不在一行,就可以省去”;”.echo $v_filefi done,Test 逻辑运算符: ! 非运算 -a 【$】 并运算 -o 【|】 或运算 例如: #!/bin/sh if $# -eq 2 | $# -eq 3 ; thenecho $#exit; fi #!/bin/sh if $# -eq 2 -o $# -eq 3 ; thenecho $#exit; fi,其它命令压宿解压命令:gzip zip compress ,gunzip
9、 unzip uncompress权限设置命令:chmod查询操作记录:history查进程和杀进程:ps 和kill查内存空间和硬盘空间:top df du分文件:split,SHELL和AWK,循环语句: 一、if 语句 If then fi; if then else fi; 例如: #!/bin/sh for v_file in ls . doif ! -s $v_file thenecho “file =0: $v_file“elif -d $v_file thenecho “dir: $v_file “elseecho “file 0: $v_file “fi done,循环语句:
10、 一、case 语句 例如:判断输入参数个数。 #!/bin/sh v_count=$#; case $v_count in 0)echo “file 0“; 1)echo “file 1“; 2)echo “file 2“; *)echo “other 2“ esac,循环语句: 一、for 语句 例如:用“号当成一个变量。 #!/bin/sh for dddd in liao guang xi # list doecho $dddd done#!/bin/sh for dddd in “liao guang xi“ doecho $dddd donefor v_file in echo $
11、* doecho $v_file done,循环语句: 一、unitl语句 select至少执行一次循环,判断是在循环末尾。#!/bin/sh for dddd in “liao guang xi“ “ddddddd“ “aaaaaaaa“ “ccccccccc“ “dddddddddd“ doecho “for output:$dddd“;until “$dddd“ = “ddddddd“ doecho “ bye bye !“break 2;done done,循环语句: 一、while语句 例如: #!/bin/sh v_count=0; echo $1 while $v_count -
12、lt $1 dov_count=expr $v_count + 1;echo $v_count ; done 例如: File1中记录: 15920152274,AA,BB,CC #!/bin/sh IFS=, while read f1 f2 f3 f4 doecho $f1 done file1,SHELL函数 #!/bin/sh #fun hello1 () echo $1 hello2 () echo $1 $2 #调用过程 case $1 in 1)hello1 222 ; 2) hello2 111 222 ; esac,AWK的写法,AWK常用变量 变量 描述 $n 当前记录的第
13、n个字段,字段间由FS分隔。 $0 完整的输入记录。 ARGC 命令行参数的数目。 ARGIND 命令行中当前文件的位置(从0开始算)。 ARGV 包含命令行参数的数组。 CONVFMT 数字转换格式(默认值为%.6g) ENVIRON 环境变量关联数组。 ERRNO 最后一个系统错误的描述。 FIELDWIDTHS 字段宽度列表(用空格键分隔)。 FILENAME 当前文件名。,AWK常用变量 变量 描述 FNR 同NR,但相对于当前文件。 FS 字段分隔符(默认是任何空格)。 IGNORECASE 如果为真,则进行忽略大小写的匹配。 NF 当前记录中的字段数。 NR 当前记录数。 OFMT
14、 数字的输出格式(默认值是%.6g)。 OFS 输出字段分隔符(默认值是一个空格)。 ORS 输出记录分隔符(默认值是一个换行符)。 RLENGTH 由match函数所匹配的字符串的长度。 RS 记录分隔符(默认是一个换行符)。 RSTART 由match函数所匹配的字符串的第一个位置。 SUBSEP 数组下标分隔符(默认值是034)。,AWK常用函数 N gsub(reg,string,target) 每次常规表达式reg匹配时替换target中的string N index(search,string) 返回string中search串的位置 A length(string) 求串stri
15、ng中的字符个数 N match(string,reg) 返回常规表达式reg匹配的string中的位置 N printf(format,variable) 格式化输出,按format提供的格式输出变量variable。 N split(string,store,delim) 根据分界符delim,分解string为store的数组元素 N sprintf(format,variable) 返回一个包含基于format的格式化数据,variables是要放到串中的数据 G strftime(format,timestamp) 返回一个基于format的日期或者时间串,timestmp是syst
16、ime()函数返回的时间 N sub(reg,string,target) 第一次当常规表达式reg匹配,替换target串中的字符串 A substr(string,position,len) 返回一个以position开始len个字符的子串,AWK常用函数 P totower(string) 返回string中对应的小写字符 P toupper(string) 返回string中对应的大写字符 A atan(x,y) x的余切(弧度) N cos(x) x的余弦(弧度) A exp(x) e的x幂 A int(x) x的整数部分 A log(x) x的自然对数值 N rand() 0-1之
17、间的随机数 N sin(x) x的正弦(弧度) A sqrt(x) x的平方根 A srand(x) 初始化随机数发生器。如果忽略x,则使用system() G system() 返回自1970年1月1日以来经过的时间(按秒计算),AWK常用模糊查询$ awk /(no|so)/ test-打印所有以模式no或so开头的行。$ awk /ns/print $1 test-如果记录以n或s开头,就打印这个记录。$ awk $1 /0-90-9$/(print $1 test-如果第一个域以两个数字结束就打印这个记录。$ awk $1 = 100 | $2 5 ? “ok “$1: “error“$1) test-如果第一个域大于5则打印问号后面的表达式值,否则打印冒号后面的表达式值。$ awk /root/,/mysql/ test-打印以正则表达式root开头的记录到以正则表达式mysql开头的记录范围内的所有记录。如果找到一个新的正则表达式root开头的记录,则继续打印直到下一个以正则表达式mysql开头的记录为止,或到文件末尾。,AWK常用实例AWK相关参考,