Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2553752
  • 博文数量: 709
  • 博客积分: 12251
  • 博客等级: 上将
  • 技术积分: 7905
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-17 00:00
个人简介

实现有价值的IT服务

文章存档

2012年(7)

2011年(147)

2009年(3)

2008年(5)

2007年(74)

2006年(431)

2005年(42)

分类: IT职场

2005-11-22 20:50:32

something about linux shell 3

修改机器名和Ip


用vi编辑 /etc/sysconfig/network and /etc/sysconfig/network-scripts/ifcfg-eth0

1) /etc/sysconfig/network

NETWORKING = yes
FORWARD_IPV4 = yes
HOSTNAME = xxxx.com #你的主机名
GATEWAY = 123.123.123.123 #网关
GATEWAYDEV = eth0

2) /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE = eth0
IPADDR = xxx.xxx.xxx.xxx #你的IP地址
NETMASK = xxx.xxx.xxx.xxx #你的子网掩码
NETWORK = xxx.xxx.xxx.xxx #你的工作网络
BROADCAST = xxx.xxx.xxx.xxx #你的广播址
ONBOOT = yes

然后运行 /etc/sysconfig/network-scripts/ifup eth0 启动。

=======================================
下面的短小的shell程序可以列出目录树, 充分利用了sed强大的模式匹配能力.
  目录树形式如下:
  .
  `----shellp
  `----updates
  `----wu-ftpd-2.4
  | `----doc
  | | `----examples
  | `----src
  | | `----config
  | | `----makefiles
  | `----support
  | | `----makefiles
  | | `----man
  | `----util
  脚本如下:
  #!/bin/sh
  # dtree: Usage: dtree [any directory]
  dir=${1:-.}
  (cd $dir; pwd)
  find $dir -type d -print | sort -f | sed -e "s,^$1,," -e "/^$/d" -e "s,[^/]*/([^/]*)$,`----1," -e "s,[^/]*/,| ,g"
=========================================
论正则表达式的“贪婪”性
2005-10-26 13:50 pm
作者:linux宝库 ()
来自:linux宝库 ()
联系:linuxmine#gmail.com

正则表达式是具有贪婪性的,我们从下面这例谈起:
已知str="uid=100(guest) gid=100(others) groups=10(users),11(floppy)"
现在想要得到这个字符串中的第一个括号内的值,即guest该怎么办?假设$str的括号外的内容是不固定的,不能依据uid之类的关键字或空格去查找,所依据的只能是找第一对括号内的内容。

很自然的我们想到用sed,因为sed具有很强的模式匹配的功能,而且能够将匹配的部分内容强行记下来用于输出。这样,我们就会想:
echo $str|sed 's/模式串/1/'
只要模式串写好了,在匹配的过程中把guest这个字符串抠出来,让sed记住,然后用1输出就可以了。怎么写这个模式串?
.*想要匹配"uid=100"
(...)告诉sed要查找括弧内的文本
(.*)让sed记住匹配内容的常用手段,这里匹配的.*将来就能用1取出来
.*想要匹配" gid=100(others) groups=10(users),11(floppy)"部分
于是我们就写成了echo $str|sed 's/.*((.*)).*/1/'
结果呢,得到的是"floppy",为什么?
正则表达式是有贪婪性的,它总是与最长的可能长度匹配,而且越是排在前面的通配符优先级越高。这一例,第一个.*可以匹配"uid=100(guest) gid=100(others) groups=10(users),11",仍然能保证后面通配符的匹配,那一对()匹配了floppy左右的括号,最后的.*自然是可有可无的,所以sed记住的就是floppy。
怎么办?我们必须打破正则表达式的贪吃性,用更明确的描述来实现这一点:
我们考虑如果在模式串中第一个.*中告诉sed这个.*是不能含有"("的,不久可以将.*限制到"uid=100"了吗?这个意思我们完全可以用[^(]*来表达,于是我们修订刚才的代码,变成:
echo $str|sed 's/[^(]*((.*)).*/1/'
似乎应该很好了,执行的结果却是"guest) gid=100(others) groups=10(users),11(floppy",为什么?
原来仍然是正则表达是的贪婪性在作怪,虽然我们有效的阻止了第一个.*的贪吃,但是我们对(.*)中的.*却未加限制,于是它尽可能匹配了"guest) gid=100(others) groups=10(users),11(floppy",还能保证后面".*"的匹配性。我们再作限制,告诉sed,(.*)中的.*不能含有"",让它跨不过guest:
echo $str|sed 's/[^(]*(([^)]*)).*/1/'
这回,输出结果终于是我们想要得"guest"了。

问题解决了,我们也了解了正则表达式(或说通配符)的贪婪性,于是就可以留个问题给大家,让大家自己体会体会:
怎么样取出str中第二对括号的内容"others"?
怎么样取出str中第三对括号的内容"users"?
怎么样取出str中第四对括号的内容"floppy"?(这个还用说吗,就利用正则表达式的贪婪性,我们最开始不就实现它了嘛)

又见michaelds的佳作。
俺来做作业。
str="uid=100(guest) gid=100(others) groups=10(users),11(floppy)"
echo $str|sed 's/[^(]*(([^)]*))[^(]*(([^)]*))[^(]*(([^)]*))[^(]*(([^)]*)
)/2/'
上式得到others,把2改成3,4可得到users和floppy。

 

全文结束 
===========================================================
awk文本处理
2004-04-23 15:18 pm
作者:linux宝库 ()
来自:linux宝库 ()
联系:linuxmine#gmail.com

我有2个文本文件
我从第一个文本文件中取得一行文本中变量中的字符串,再附值另一个变量----这一步我已实现

现我想到第二文本中搜索上一步附值的变量,并从搜索到的行或行中的某一变量中取得字符
串变量再返回第一文本中执行命令(余下命 令中要用到第二文本中取得的字符串变量)。

请高手出手,不知该如何实现???????

能不能给两个文本,这种东西每个实现方式多是不一样的

tmp1:
qwe rtgbh52800op
poil 7851fghjj874
tmp2
poil 999rrr
qwe uytppp
我现在要用tmp2中的$2字段中的几个字符串替换tmp1中的$2字段中的几个字符串

Like database, use 'join' !

当然不是这么简单

我也想问问?AWK中能同时对两个文件操作吗?或者AWK可以嵌套吗?如果都不行,那你可以试试用SHELL编个小程序。
for var1 in `cat tmp1'
done
for var2 in 'cat tmp2'
done
if var1 ? var2 then
command var1 var2
do
do
当然我也知道的不多,你可以考虑类似的想法!


awk ' BEGIN { i=1
while((getline < "tmp2")>0)
{ F[[i]]=$1; S[[i]]=$2; i++ }
line=i
}
{ for(j=1;j<=line;j++)
{ if($1==F[[j]]) printf "%s,%s
",$1,S[[j]] }
}
' tmp1
先把tmp2文件的$1,$2读入数组,然后再操作tmp2

-------------

Sorry: 昨天写完之后没有仔细看

楼上的是否应是 { F[i]=$1; S[i]=$2; i++ }

如果要求就是像tmp1,tmp2那样,为什么不这样:(要是想把tmp1中不匹配的也打出来稍微改动即可)
while read line;do
key=`echo $line|cut -d" " -f1`
grep $key tmp2
done < tmp1

如果两个排序后第一列一样的话,用paste也很简单.

第一列不一样的


我有如下二个文本temp1
qwaszbbbpol 2001020300000666.25000009875213
rfvcgaaaujn 3021545669000008.99000000000512
... ...
temp2
985hjklfsaaa95fh 7845.56
fv5684521bbbtgd6 44.14
... ...
现要根据第一列中字段中的aaa或bbb,... 为两个文本的对应关系,搜索到以后用temp2中
的$2值替换temp1中$2中的有小数点的其中几个字符或数值

DO YOU KNOWN ????

我想你的问题只不过又增加了复杂度。
你可以在awk里用substr。

不喜欢做类似的家庭作业。
是Do you know吧。

这是我的实际问题,我要统计数据!

我靠,受不了了。(对不起,我很少这么冲动),发帖子也是要讲学问的,否则只有让人生厌,哪里能解决问题。我先泛泛说说发帖的问题:
有内容(不要只靠个标题就over了吧)
题目既引人又能实事求是的说明问题("help!求救!"来这的,有谁不是要说help的?将来看到这样的题目谁能知道是干什么的?)
经过自身思考(不要东抄西抄,或是有一点问题,毫不探究,直接问将上来,连自己身边的参考书或是man帮助都不查一下;别人的回答,即使没有100%解决问题,关键地方解决了,其余凭自己完全可以搞定,也不死心的追问不停,直到获得100%的代码,paste完事)
表达清楚(是什么就是什么,颠三倒四或是含糊其辞、连连省略地说一大通,唐僧也要自愧不如的)
描述详尽(发了帖自己至少要推敲一番,假定别人完全没有你的问题背景,能不能领会你的意思?相关的细节是否说清楚了呢?不要让别人反复追问你细节都得7,8帖吧)

这位ljp0683仁兄,也许你的问题涉及保密性,你可以不按问题的原样来问大家,可是就得保证你的描述方式是清楚地啊。大家好意的猜测你的意思,提出自己的解决方法,你再挤牙膏地告诉,不是这样不是那样,最终举的例子也没把问题说清楚,还挺有火气。斑竹的目前的回应心情也就完全可以理解了。
我来问问你的描述是什么意思?第一列的aaa,bbb是怎样确定的?是几个连续的字符?(若是,那是连续几个呢)还是从固定的第几个字符算起到第几个字符结束?找不到对应关系的行怎么处理?还有到底是temp2的$2替换temp1的$2的哪个?是$2全部,还是小数点部分?
大家对你的几个回答,一点启发都没有?不能根据大家的思路完成其余的工作?
我们对你的问题背景一无所知,对于我们来说没有默认值的,所以才需要你描述清楚啊!要是多几个这样的帖子,大家的耐心都会磨没的,日子长了,这个论坛也就自己消亡了。


 

全文结束 

===========================================================
awk中如何使用shell的环境变量
2004-04-23 15:18 pm
作者:linux宝库 ()
来自:linux宝库 ()
联系:linuxmine#gmail.com

一:"'$var'"
这种写法大家无需改变用'括起awk程序的习惯,是老外常用的写法.
如:
var="test"
awk 'BEGIN{print "'$var'"}'
这种写法其实际是双括号变为单括号的常量,传递给了awk.
如果var中含空格,为了shell不把空格作为分格符,便应该如下使用:
var="this is a test"
awk 'BEGIN{print "'"$var"'"}'

二:'"$var"'
这种写法与上一种类似.
如果变量含空格,则变为'""$var""'较为可靠.

三.把括起awk程序的''变为"",使用"$var"
如:
$var="this is a test"
awk 'BEGIN{print "$var"}"

这是因为在""里$是特殊字符,而在''里$是普通字符.

四:export 变量,使用ENVIRON["var"]形式
如:
$var="this is a test";export $var
awk 'BEGIN{print ENVIRON["var"]}'

五:当然也可以使用-v选项
如:
$var="this is a test"
awk -vnvar="$var" '{print nvar}'
这样便把系统变量定义成了awk变量.

偶喜欢使用第一种写法.
欢迎交流.


 

全文结束 

===========================================================
awk中如何用print输出单引号
2004-04-23 15:18 pm
作者:linux宝库 ()
来自:linux宝库 ()
联系:linuxmine#gmail.com

用转义好像不行耶!
如:
echo "something" | awk '{print "'"}'
时提示输入下一行,但下一行输入"
报错:
awk: cmd. line:1: {print "}'
awk: cmd. line:1: ^ unterminated string
谁来帮小弟一把!

突然想到一个办法:
echo "aa" | awk '{print "47"}'
似乎可读性有些差!

echo "'"|awk '{print $0}'

cat /dev/null|awk "BEGIN{print "'"}"

忘了是在坛子里篇文章上看到过的,说是这样也可以
cat filename | awk "{printf "Var1='%s',Var2='%s'
",$1,$2}"
记不太清,不知对不对?
今天试了下,果然不对,应该这样
cat filename | awk "{printf "Var1='%s',Var2='%s'
",$1,$2}"

cat /dev/null|awk "BEGIN{print "'"}"

cat /dev/null 是做何用?
cat /dev/null|awk "BEGIN{print "'"}" 在csh下通不过!

有老版本的awk没有输入会等待.
新版本的awk直接用BEGIN就可以了.
可以在自己的系统上测一下。


 

全文结束 

===========================================================
awk中使用shell变量疑问
2004-04-23 15:18 pm
作者:linux宝库 ()
来自:linux宝库 ()
联系:linuxmine#gmail.com

2002/01/01
1312 32132 AA 32132131

#!/bin/sh
echo "ENTER:"
read key
cat tt|awk '{if(prev=="$key")print;prev=$1}

以上内容
如果我输:2002/01/01
没结果输出!
又错了?

你的想法不错,但awk中不能如此使用变量,可改成以下形式,便可以了。
echo "enter:"
read key
export key
cat filename|awk '{if(prev==ENVIRON["key"])print;prev=$1}'

这样也可以:
echo "enter:"
read key
cat filename|awk '{if(prev=="'$key'")print;prev=$1}'

还有很多种方法.就不一一列举了.可以查看于awk有关的帖子.

版主。在AWK中使用SHELL变量还有别的方法吗?除了你使用的:
export value
a=environ['key']

-v 选项也可以指定一个变量
这个问题原来讨论过,搜索一下吧

shell变量传给awk,我会这样用,尤其当传入的变量特长(>399byte)时!!!
export a="hello"
awk 'BEGIN{ "echo $a" | getline x; print x; }'


var1=abcd
var2=efgh
echo "" | awk -v first=$var1 -v second=$var2 '{print first""second}'

[DISPLAY] abcdefgh


 

全文结束 

===========================================================
awk中str可不可以相加
2004-04-23 15:18 pm
作者:linux宝库 ()
来自:linux宝库 ()
联系:linuxmine#gmail.com

str1="qwe"
str2="rty"
现在我要把这 2 个str 变成一个

str="qwerty"

可不可以用 str=str1+str2

不能用加。
不用awk可以实现,如
str=$str1$str2
在awk里,指的是在awk里有效吗?

是的

In awk :

awk 'BEGIN{str1="abc";str2="def";str=sprintf("%s%s",str1,str2);print str}' /dev/null

the output will be: abcdef

 

全文结束 

===========================================================
cut的用法
2004-04-23 15:18 pm
作者:linux宝库 ()
来自:linux宝库 ()
联系:linuxmine#gmail.com

我们经常会遇到需要取出分字段的文件的某些特定字段,例如 /etc/password就是通过":"分隔各个字段的。可以通过cut命令来实现。例如,我们希望将系统账号名保存到特定的文件,就可以:
cut -d: -f 1 /etc/passwd > /tmp/users
-d用来定义分隔符,默认为tab键,-f表示需要取得哪个字段

当然也可以通过cut取得文件中每行中特定的几个字符,例如:
cut -c3-5 /etc/passwd
就是输出/etc/passwd文件中每行的第三到第五个字符。
-c 和 -f 参数可以跟以下子参数:
N 第N个字符或字段
N- 从第一个字符或字段到文件结束
N-M 从第N个到第M个字符或字段
-M 从第一个到第N个字符或字段


 

全文结束 

===========================================================
如何用date获得前一天的日期
2004-04-23 15:18 pm
作者:linux宝库 ()
来自:linux宝库 ()
联系:linuxmine#gmail.com

int date8_add(char *date8,char ymd,int value,char *date8added);
int checkdate8(char *date8);
long int days_from_8zeros(char *date8);
int get_data8_from_days(long int days,char *date8);


//功能:计算某年月日前后一定年数(或月数、天数)的年月日
//输入:
// 1. date8 计算基准日期
// 2. ymd 表示下一变量的单位 'y'-年 'm'-月 'd'-日
// 3. value 偏移量:年数、月数、天数
//输出:
// 1. date8added 计算后结果
//返回:
// 0 成功
// -1 date8非法
// -2 ymd非法
// -3 value非法
// -4 转换后date8added的年份小于公元1年
// -5 转换后date8added的年份大于公元9999年
// -6 转换后date8added非法,例如得到结果为2002/02/30
int date8_add(char *date8,char ymd,int value,char *date8added)
{
char strtmp[10];
long int days;
int c,vyear,vmonth,vday;
int errbz;

// 检查参数date8的合法性
errbz=checkdate8(date8);
if (errbz!=0) return(-1);

// 检查参数ymd的合法性
if ( ymd!='y' && ymd!='m' && ymd!='d') return(-2);

// 检查参数value的合法性(简单检查)
//if ( value < -9999 || value > 9999 ) return(-3);

// 当增加量为年数时,计算结果并返回
if (ymd=='y')
{
memset(strtmp,0,sizeof(strtmp));
memcpy(strtmp,date8+0,4);
sscanf(strtmp,"%d",&vyear);
vyear+=value;
if ( vyear<1 ) return(-4); //小于公元1年
if ( vyear>9999 ) return(-5); //大于公元9999年

strcpy(date8added,date8);
sprintf(strtmp,"%04d",vyear);
memcpy(date8added,strtmp,4);
errbz=checkdate8(date8added);
if (errbz!=0) return(-6); //计算所得结果非法
return(0);
}

// 当增加量为月数时,计算结果并返回
if (ymd=='m')
{
vyear=0;
vmonth=0;
vday=0;

memset(strtmp,0,sizeof(strtmp)); memcpy(strtmp,date8+0,4); sscanf(strtmp,"%d",&vyear);
memset(strtmp,0,sizeof(strtmp)); memcpy(strtmp,date8+4,2); sscanf(strtmp,"%d",&vmonth);
memset(strtmp,0,sizeof(strtmp)); memcpy(strtmp,date8+6,2); sscanf(strtmp,"%d",&vday);

vmonth=vyear*12+vmonth+value;
vmonth--;
vyear=vmonth/12;
vmonth=vmonth%12;
vmonth++;

if (vyear<1) return(-4);
if (vyear>9999) return(-5);
sprintf(date8added,"%04d%02d%02d",vyear,vmonth,vday);
errbz=checkdate8(date8added);
if (errbz!=0) return(-6);
return(0);
}

// 当增加量为天数时,计算结果并返回
if (ymd=='d')
{
days=days_from_8zeros(date8);
days+=value;
if (days<=366) return(-4); //年号为0000
if (days>3652425) return(-5); //年号超出9999
errbz=get_data8_from_days(days,date8added);
if (errbz!=0) return(-1);
return(0);
}

}


//检查日期YyyyMmdd
//输入:date8 日期字符串
//返回:0-正确 -1-错误
int checkdate8(char *date8)
{
int c;
int errdate=0;
char str_year[5]="";
char str_mon[3]="";
char str_day[3]="";
int int_year,int_mon,int_day;
int leap_year; // 1-闰年 0-不是闰年

errdate=0;
if ( strlen(date8) != 8 ) errdate=1;
if (errdate!=1)
{
for (c=0;c<10;c++)
{
if (date8[c]==' ') errdate=1;
}
if ( date8[0] < '0' || date8[0] > '9' ) errdate=1;
if ( date8[1] < '0' || date8[1] > '9' ) errdate=1;
if ( date8[2] < '0' || date8[2] > '9' ) errdate=1;
if ( date8[3] < '0' || date8[3] > '9' ) errdate=1;
if ( date8[4] < '0' || date8[4] > '9' ) errdate=1;
if ( date8[5] < '0' || date8[5] > '9' ) errdate=1;
if ( date8[6] < '0' || date8[6] > '9' ) errdate=1;
if ( date8[7] < '0' || date8[7] > '9' ) errdate=1;
}

if (errdate!=1)
{
str_year[0]=date8[0]; str_year[1]=date8[1];
str_year[2]=date8[2]; str_year[3]=date8[3];
str_year[4]='

 

全文结束 

===========================================================
双机(多机)自动互备份方案
2004-04-23 15:18 pm
作者:linux宝库 ()
来自:linux宝库 ()
联系:linuxmine#gmail.com

问 题:
  我们公司有两台LINUX服务器,每个服务器只有一个硬盘。所以备份的问题就显得特别重要。我们装有MySQL数据库。当然同时也要解决MySQL备份的问题。

目 的:
  host 机器最终所有备份都在其上留备份,ship机器保存host机器备份

方 法:
  通过shell脚本,打包相关要备份的文件。然后通过ftp操作下载,上载完成解决方案。
  两台机器root 通过crontab 让脚本在各自机器定时执行。
  建议host 每天早上3点执行。
  建议ship 每天早上6点执行。

注意点:
  两台服务器系统时间最好相差不要超过1小时。
  此脚本是每周礼拜6执行备份的。当然你也可以修改成每月或每天备份。
  当然也可以修改成一个增量备份脚本。

具体脚本:
以下为host机器脚本
#//////////////host机器脚本///////////////
#! /bin/sh
HOST="abc.com"
USER="backup_use" #ship机器backup_use用户
PASSWORD="backup_use" #ship机器对应用户密码
BACKUPDIR="/home/backup_use/ship" #host机器backup_use用户目录
BACKUPDIR2="/home/backup_use/host" #host机器backup_use用户目录
MYSQLPASS="abc" #ship 机器MySQL root 用户密码
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/nusphere/MySQL/bin
DOW=`date +%a`
DM=`date +%Y%b%d`

FILE1=ship-virtual-$DM.tar.gz
FILE2=ship-MySQLdata-$DM.tar.gz
FILE3=ship-szeasy-$DM.tar.gz
FILE4=ship-other-$DM.tar.gz
#
FIL1=$BACKUPDIR2/host-main-$DM.tar.gz
FIL2=$BACKUPDIR2/host-MySQLdata-$DM.tar.gz
FIL3=$BACKUPDIR2/host-other-$DM.tar.gz
#
DIRECTORIE1="/www /home/jjd" # 要备份的目录1
DIRECTORIE2="/etc /var/named /usr/local/nusphere/apache/conf" # 要备份的目录2
#
if [ $DOW = "Sat" ]; then # 每个礼拜六完全备份
tar -zcpf $FIL1 $DIRECTORIE1
tar -zcpf $FIL3 $DIRECTORIE2
MySQLdump --all-databases -q -uroot -p$MYSQLPASS |gzip > $FIL2
ftp -i -n < $BACKUPDIR/$COMPUTER-MySQLdata-$DM.tar.gz
fi


 

全文结束 

===========================================================
删除一个月以前的文件
2004-04-23 15:18 pm
作者:linux宝库 ()
来自:linux宝库 ()
联系:linuxmine#gmail.com

我要实现在一个目录下根据ls -l文件的日期,删除一个月以前的文件,我用了以下code,但是提示Ntemp: Undefined variable。还有在一开始就提示Command not found。
#!/bin/csh

#echo "取得系统当前日期"
NDate=`date |awk '{print $1}'`
Ntemp=`date |awk '{print $2}'`
NYear=`date |awk '{print $6}'`
#echo $Ntemp
case $Ntemp in
Jan) NMonth="01" ;;
Feb) NMonth="02" ;;
Mar) NMonth="03" ;;
Apr) NMonth="04" ;;
May) NMonth="05" ;;
Jun) NMonth="06" ;;
Jul) NMonth="07" ;;
Aug) NMonth="08" ;;
Sep) NMonth="09" ;;
Oct) NMonth="10" ;;
Nov) NMonth="11" ;;
Dec) NMonth="12" ;;
*) echo "not found
";exit ;;
esac
#echo $NMonth

#echo "取得要删除的文件日期月份"
if [NMonth==1] then
DMonth = 12
else
DMonth = NDate-1
fi

#echo "取得文件日期"
while
do
FDate=`ls -l |awk '{print $7}'`
Ftemp=`ls -l |awk '{print $6}'`
#FYear=`ls -l |awk '{print $0}'`
FileName=`ls -l |awk '{print $9}'`
case $Ftemp in
Jan) FMonth="01" ;;
Feb) FMonth="02" ;;
Mar) FMonth="03" ;;
Apr) FMonth="04" ;;
May) FMonth="05" ;;
Jun) FMonth="06" ;;
Jul) FMonth="07" ;;
Aug) FMonth="08" ;;
Sep) FMonth="09" ;;
Oct) FMonth="10" ;;
Nov) FMonth="11" ;;
Dec) FMonth="12" ;;
*) echo "not found
";exit ;;
esac
#echo $FMonth
if [DMonth>FMonth] then
rm -f $FileName
elif [DMonth==FMonth]&&[NDate>FData] then
rm -f $FileName
fi
done

请教各位大虾,怎么样去除这种错误?而且,假如我要删除一年前的文件,用ls -l命令怎么找年的时间?我用的环境是OSF1 alpha V4.0.
谢谢!


至于你的代码错误有:
1. 你这个怎么会是c shell?应该是 B shell 阿。所以第一行应为 #!/bin/sh
2. if [NMonth==1] then 错了!,这句有多个错误啊应为 if [ $NMonth -eq 1 ] ; then
或者 if [ $NMonth -eq 1 ] #换行
then
3. DMonth = NDate-1 错了。应为 DMonth=`expr $NDate - 1`
。。。。。。
不找了,建议你找shell书先看看。
NDate=`date |awk '{print $1}'` 可以用 date '+%d' 更方便。


测试一下语句:

#!/bin/sh
echo "test
"
echo -e "test
"

 

全文结束 

===========================================================
删除指定内容的重复行
2004-04-23 15:18 pm
作者:linux宝库 ()
来自:linux宝库 ()
联系:linuxmine#gmail.com

$cat test
werwrtert
ERROR*
ERROR*
ddffadfasf
sdfsfsfsfs
ERROR*
ERROR*
ERROR*
end
ERROR*
dddd
ERROR*

期望:
$./cx test
werwrtert
ERROR*
ddffadfasf
sdfsfsfsfs
ERROR*
end
ERROR*
dddd
ERROR*

脚本cx如下:
$cat cx
#!/usr/bin/awk -f

{ if ($0 == "ERROR*" && error_line == "ERROR*")
next; error_line=$0; print }

---------------------------

cat test | uniq

但是你没有指定重复的内容,这样,别的重复行也被删除了
如果test中有
abc
abc
如果我不希望删除abc呢?呵呵

补充一下uniq的用法
1. 无选项参数: 将源文件中的连续多相同行简化为一行,然后输出全文
2. -d : 将源文件中的连续多相同行简化为一行,然后输出这些行
2. -u : 排除源文件中的连续多相同行,然后输出其他行


 

全文结束 

阅读(2024) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~