awk,sed,文件名,时间戳

...

http://blog.163.com/wf_shunqiziran/blog/static/17630720920121205110500/

 

 http://bbs.chinaunix.net/thread-2325328-1-1.html

http://blog.chinaunix.net/uid-10540984-id-342153.html

以上是些数据库的备份文件,现在通过awk提取出日期然后只保留最近7天的数据库备份...
PS:只能由文件名内包含的信息来确定日期


 
  1. ls 2*.gz | awk -F'_' -vd=$(date +%Y%m%-"-7 days") '$1$2$3<d{system("rm -f "$0"")}'

[解析]

  以前对于时间的加减是相当复杂而麻烦的事情,因为都不是10进制计算的。好在date命令给我们提供了类似 '-7 days' 或者 '7 days ago' 这样的格式,剩下的计算就交给命令吧。

 http://hi.baidu.com/zyhzsz1/blog/item/de2c3509fb52c137e9248813.html

 
Linux系统下查看某文件修改的时间戳
2009-02-12 23:37

 

 

查看文件时间戳命令:stat awk.txt 
File: `awk.txt' 
Size: 20              Blocks: 8          IO Block: 4096   regular file 
Device: 801h/2049d      Inode: 380730      Links: 1 
Access: (0644/-rw-r--r--) Uid: (    0/    root)   Gid: (    0/    root) 
Access: 2008-04-26 01:50:44.000000000 +0800 
Modify: 2008-04-26 01:48:18.000000000 +0800 
Change: 2008-04-26 01:48:18.000000000 +0800
 
说明:Access访问时间。Modify修改时间。Change状态改变时间。可以stat *查看这个目录所有文件的状态。

现在是要过滤出Modify的时间戳,并以yyyyMMddHHSS格式保存,则可以利用下面这条命令: 
stat awk.txt | grep -i Modify | awk -F. '{print $1}' | awk '{print $2$3}'| awk -F- '{print $1$2$3}' | awk -F: '{print $1$2$3}' 
输出结果:20080426014818
 
 
修改文件时间与创建新文件:touch

在介绍ls命令时,提到每个文件在Linux下面都会记录3个主要的修改时间:
• modification time(mtime,修改时间):当该文件的“内容数据”更改时,就会更新这个时间。内容数据指的是文件的内容,而不是文件的属性。
• status time(ctime,状态时间):当该文件的”状态(status)”改变时,就会更新这个时间,举例来说,更改了权限与属性,就会更新这个时间。
• access time(atime,存取时间):当“取用文件内容”时,就会更新这个读取时间。举例来说,使用cat去读取 ~/.bashrc,就会更新atime了。
举例来说,我们来看一看/etc/man.config文件的时间。

[root@linux ~]# ls -l /etc/man.config
-rw-r--r-- 1 root root 4506 Apr 8 19:11 /etc/man.config
[root@linux ~]# ls -l --time=atime /etc/man.config
-rw-r--r-- 1 root root 4506 Jul 19 17:53 /etc/man.config
[root@linux ~]# ls -l --time=ctime /etc/man.config
-rw-r--r-- 1 root root 4506 Jun 25 08:28 /etc/man.config

看到了吗?在默认的情况下,ls显示的是该文件的mtime,也就是这个文件的内容上次更改的时间。我的系统是在6/25安装的,因此,这个文件产生但状态更改的时间就回溯到那个时间点。因为刚才的范例中使用到这个文件,所以,它的atime就会变成刚刚使用的时间了。

文件的时间很重要,因为如果误判文件时间,可能会造成某些程序无法顺利运行。那么,万一我发现了一个文件来自将来(很多时候会有这个问题的。我们在安装的时候,提到的GMT时间就是那个意思),该如何让该文件的时间变成“现在”的时刻呢?很简单,用touch命令即可。

[root@linux ~]# touch [-acdmt] 文件
参数:
-a : 仅修改access time。
-c : 仅修改时间,而不建立文件。
-d : 后面可以接日期,也可以使用 --date="日期或时间"
-m : 仅修改mtime。
-t : 后面可以接时间,格式为 [YYMMDDhhmm]
范例:

范例一:新建一个空的文件。
[root@linux ~]# cd /tmp
[root@linux tmp]# touch testtouch
[root@linux tmp]# ls -l testtouch
-rw-r--r-- 1 root root    0 Jul 19 20:49 testtouch
# 注意,这个文件的大小是0。在默认的状态下,如果touch后面接文件,
# 则该文件的3个时间(atime/ctime/mtime)都会更新为当前时间。若该文件不存在,
# 则会主动建立一个新的空文件。例如上面这个例子。

范例二:将 ~/.bashrc复制成为bashrc,假设复制完全的属性,检查其日期。
[root@linux tmp]# cp ~/.bashrc bashrc
[root@linux tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
-rwxr-xr-x 1 root root 395 Jul 4 11:45 bashrc <==这是mtime
-rwxr-xr-x 1 root root 395 Jul 19 20:44 bashrc <==这是atime
-rwxr-xr-x 1 root root 395 Jul 19 20:53 bashrc <==这是ctime
# 在这个案例中,我们使用了 ; 命令分隔符,它的用法我们会在Bash shell中提到。
# 此外,ll是ls -l的命令别名,这个也会在bash shell中再次提及,
# 当前可以简单地想成,ll就是ls -l的简写。至于 ; 则是同时发出两个命令,
# 且让两个命令“按顺序”执行的意思。上面的结果中可以看到,该文件更改的日期
# Jul 4 11:45,但是atime与ctime不一样。

范例三:修改案例二的bashrc文件,将日期调整为两天前。
[root@linux tmp]# touch -d "2 days ago" bashrc
[root@linux tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
-rwxr-xr-x 1 root root 395 Jul 17 21:02 bashrc
-rwxr-xr-x 1 root root 395 Jul 17 21:02 bashrc
-rwxr-xr-x 1 root root 395 Jul 19 21:02 bashrc
# 与上一个范例比较,本来是19日的变成了17日了(atime/mtime)。
# 不过,ctime并没有跟着改变。

范例四:将上个范例的bashrc日期改为2005/07/15 2:02。
[root@linux tmp]# touch -t 0507150202 bashrc
[root@linux tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
-rwxr-xr-x 1 root root 395 Jul 15 02:02 bashrc
-rwxr-xr-x 1 root root 395 Jul 15 02:02 bashrc
-rwxr-xr-x 1 root root 395 Jul 19 21:05 bashrc
# 注意,日期在atime与mtime都改变了,但ctime则是记录当前的时间。

通过touch命令,可以轻松地修改文件的日期与时间。并且,也可以建立一个空文件。不过,要注意的是,即使复制一个文件,复制所有属性,但也没有办法复制ctime属性。ctime可以记录文件最近改变状态(status)的时间。无论如何,还是要说明一下,我们平时看的文件属性中,比较重要的还是mtime。我们关心的常常是这个文件的“内容”是什么时候更改的。
touch这个命令最常用的情况是:
• 建立一个空文件。
• 将某个文件日期修改为当前日期(mtime与atime)。

与文件相关的几个时间:

1、访问时间,读一次这个文件的内容,这个时间就会更新。比如对这个文件使用more命令。ls、stat命令都不会修改文件的访问时间。


2、修改时间,对文件内容修改一次,这个时间就会更新。比如:vi后保存文件。ls -l列出的时间就是这个时间。

3、状态改变时间。通过chmod命令更改一次文件属性,这个时间就会更新。查看文件的详细的状态、准确的修改时间等,可以通过stat命令 文件名。

 

###################################################

http://www.etang.info/web-develop/bash-shell-date.html

bash shell 中date时间戳的妙用

2010年12月17日admin发表评论阅读评论
 
6
7
8
9
10
11
#!/bin/bash
time=`date +%F-%H-%M-%S`
log=import$time.log
cd /opt/saas/job/import 
touch log/$log
php index.php &>log/$log
6
7
8
9
10
11
#!/bin/bash
time=`date +%F-%H-%M-%S`
log=push$time.log
cd /opt/saas/job/import 
touch log/$log
php push.php &>log/$log

BASH 编程 — 项目文档
UPLOOKING Bash ——项目文档

BASH编程 — 项目文档

1、批量添加用户

1. 需求分析:
在系统管理工作中,有时需根据一些开发项目的需求、企业用户的迁移等,可
能需要大批量的添加用户,逐步手动添加是一件非常繁琐的事情,可能还会出现
很多错误,给公司的运转带来不必要的麻烦和经济上的损失。为了正确高效的完成
这类工作,这时候就需要根据实际情况编制shell脚本。

2.实现方法:
在添加用户、迁移用户时,需根据用户已有的一些设置或要求来完成添加和迁
移,可能存在下列情形:

a.用户名称各异;
b.用户的家目录已存在,甚至可能目录名称怪异与用户名不一致
c.密码已存在,用户不希望更改已有密码。
3.算法分析:
先把用户名和密码导出到一个普通的文本文件中,如果对新建用户的家目录有
要求可以在后面(第三列)给出用户的家目录具体的看下面说明了每列的含义
username password home group shell

a.先写文件锁,当脚本使用中让其他人不能更改脚本
b.参数选择项,-U,-P
c.判断文件是否存在。

d.应注意任何退出前删除LOCK文件
e.按列读取用户和密码文件,当用户为空时报错,密码为空时使用默认密码
4. 代码实现:
#!/bin/bash
LOCKfile=/root/test/useradd.LOCK
if [ -f "$LOCKfile" ]; then #判断锁文件是否存在
echo “LOCK file is exist” && exit
else
touch /root/test/useradd.LOCK
fi
while [ $# -gt 0 ] ; do #判断参数
case “$1″ in
-u )
shift;

[ -f "$1" ] && USER_FILE=$1 ||
echo “USER_FILE not found” &&

rm -f $LOCKfile && exit

shift;;
-p )

shift;
[ -f "$1" ] && PASSWD_FILE=$1 ||
echo “PASSWD_FILE not found” &&

rm -f $LOCKfile && exit

shift;;

*
)
shift ;;
esac
done
userline=$(wc -l $USER_FILE|cut –d ‘

-f1) #获取user文件第一列行数值
passwdline=$(wc -l $PASSWD_FILE|cut –d ‘

-f1) #获取passwd文件第一列的

行数值
if [ $userline -eq$passwdline ];then
if [ "$userline" -eq
0 ] ||
[ "$passwdline" -eq
0 ]#对两个文件的判断
then
echo “USER_FILE or PASSWD_FILE is empty” && exit

else
sed -i ‘s/^$/PASSWD/’
/root/test/passwd.file
for line in `seq
1 $userline`

do
username=$(tail +$line $USER_FILE|head -1|awk
‘{
print $1 }’)
home=$(tail +$line $USER_FILE|head -1|awk
‘{
print $2 }’)
passwd=$(tail +$line $PASSWD_FILE|head -1)
if [ -z
"$home" ]

then
useradd $username

echo $passwd|passwd $username –stdin

else
useradd $username -d $home
echo $passwd|passwd $username –stdin

fi
done
fi
else

echo “userline != passwdline” && exit
fi
rm -f /root/test/useradd.LOCK

2、备份策略

1.需求分析:
如果你经历过硬盘损坏,你就知道多么痛苦。十分重要、无法替代的数据丢
失,你可能需要花上很长的时间去安装系统和应用程序。这绝不是什么有趣的历
程,这样的事情只需要一次,就足够让你意识到为你的关键数据进行常规备份
的重要性了,尤其对企业里的系统管理人员来说,这几乎是其日常工作最为重
要的一环!

2.实现方法:
a. 完全备份:
完全备份就是保存一个指定的磁盘或分区中的每个文件的备份方式,可
以用其恢复整个磁盘、分区甚至可以用来重建系统。但其存在明显的缺点,需
占用大量的磁盘空间和耗费大量的时间,这取决于你的系统的文件的使用频
率和你的设备的容量大小,可以每几个星期作一次,可以留到周末系统负荷
较低时再进行。

b.增量备份:
增量备份仅包含上一次完全备份实施后添加和修改过的文件。增量备份可节
省磁盘设备,相对完全备份,增量备份只需很少的时间去完成。
c. 差异备份:
差异备份用于复制自上次完全或增量备份以来所新建或修改过的文件。它不
将文件标记为已经备份(换句话说,没有清除存档属性)。这就是说,正常

或增量备份去掉了文件的 “存档”属性,在新文件创建或旧文件被修改后,
文件重新被加上了 “存档”属性,差异备份就是备份这类文件。在备份完毕
后,差异备份并不会清除这类文件的 “存档”属性,这样的话,在下次运行
差异备份的时候,只要在此期间上次差异备份的文件没有被更改,则它们还
会包含在备份集中,将被再次备份。(差异备份理解的不透彻,参考了他人
思路)

3.算法分析:
利用shell脚本和cron守护进程,可以自动执行备份工作。在脚本中通过tar命
令来完成文件备份,其优点是可以把很多文件、目录放在一个文件中,并且保留
ugo的权限,方便数据的恢复。
3.代码实现:
a. 完全备份
#!/bin/bash

DATADIR=/root/test/data

BAKDIR=/root/test/backup

DATE=`date +”%F-%H%M%S”`
#时间变量

find $DATADIR >
$BAKDIR/$DATE”.list” #生成文件列表

echo BACKUP BEGIN `date +”%F-%H%M%S”`
>>
/root/test/log

mkdir -p $BAKDIR/$DATE

tar -cf –T
$BAKDIR/$DATE”.list” |
tar -xf –C $BAKDIR/$DATE/ -v
-

index-file $BAKDIR/$DATE”.index” #使用tar命令备份表中的文件

cat $BAKDIR/$DATE”.index” >>
/root/test/log

echo BACKUP END
`date +”%F-%H%M%S”`
>>
/root/test/log

echo -e “\n\n\n” >>
/root/test/log

b.增量备份
#!/bin/bash

DATE=`date +”%F-%H%M%S”`

BAKDIR=/root/test/backup

DATADIR=/root/test/data

LASTLIST=`ls /root/test/backup/*.list|sort|tail -n1`

find $DATADIR >
$BAKDIR/$DATE”.list”

find $DATADIR -newer $LASTLIST
>
$BAKDIR”/up.lst” #生成增量文件备份列

mkdir -p $BAKDIR/$DATE

echo BEGIN BACKUP `date +”%F-%H%M%S”`
>>
/root/test/log

tar -cf –T
$BAKDIR/up.lst |
tar -xf –C $BAKDIR/$DATE/ -v
-

index-file $BAKDIR/$DATE”.index” #使用tar命令备

份表中的文件

cat $BAKDIR/$DATE”.index” >>
/root/test/log

echo END
BACKUP `date +”%F-%H%M%S”`
>>
/root/test/log

echo -e “\n\n\n” >>
/root/test/log

c. 差异备份
for newpath in `cat $BAKDIR”/up.lst”`

do

tobereplace=$(
cat $BAKDIR/list |
grep $newpath )

tobereplacerwx=$(
cat $BAKDIR/rwx.lst |
grep $newpath )

new=$(cat $BAKDIR/list|grep $newpath|awk
‘{print $1″

‘$BAKDIR/$DATE’”}’)

rwx=$(ls -l $newpath |
awk
‘{
print $1 }’)

rwxfull=$(cat $BAKDIR/rwx.lst|grep $newpath|awk
‘{print $1″ :
‘$rwx’”}’)

if [ -z
"$tobereplace" ]

then

echo $newpath $BAKDIR/$DATE >>
$BAKDIR/list

echo $newpath :
$rwx >>
$BAKDIR/rwx.lst

else

oldpath=$(cat $BAKDIR/list|grep $newpath|awk
‘{print $2″‘$newpath’”}’)

sed -i “s#$tobereplace#$new#” $BAKDIR/list

path=$(cat $BAKDIR/list|grep $newpath|awk
‘{print $2″‘$newpath’”}’)

diff $oldpath $path >
/foo/bar/diff_file

sed -i “s#$tobereplacerwx#$rwxfull#” $BAKDIR/rwx.lst

fi

done

echo `diff $LASTLIST
$BAKDIR/$DATE”.list”|egrep ‘^<'|awk
'{print }'`
has

deleted >>
/foo/bar/log

3、远程备份

1.需求分析:
为网络内的多台机器共享一台备份设备,比起为网络中的每个系统安装设置
一个备份设备,这种方法更经济更方便。前面的备份方式都可以通过远程网络来进行,
备份到网络中的共享备份设备上。

2.实现方法:共享的备份设备设定为文件服务器,客户机器进行远程备份时使用
key
ssh远程登录到,结合使用scp和文件锁实现无干扰情况下的文件拷贝操作。
3.代码实现:
#!/bin/bash
LOCK=/tmp/LOCK
ERRLOCK=11
a=0

if [ -f $LOCK ]

then
while [ a -eq
3 ]
do
if [ -f $ LOCK ]

then
sleep 15
a=a+1
else
break;

fi
done
exit

echo error$ERRLOCK
cp /putdir/pub/*
/www/pub/
rm $LOCK

#!/bin/bash
LOCKLOCK=/tmp/LOCK
touch $LOCK
ERRLOCK=11
ssh apache ls $LOCK
if[0-eq$?]then :;

else exit $ERRLOCK;fi
ssh apache touch $LOCK
scp /cmsdir/file/*
x.x.x:/putdir/pub#目标位置
rm $LOCK
ssh apache rm $LOCK

4、 rsync备份

1.需求分析:如果你经历了重大的磁盘崩溃事件,那么进行备份的努力哪怕是进行
了许多次也是值得的,如果不擅长shell脚本,那么怎么实现数据的及时高效的
备份呢?
2.实现方法:利用rs ync这个工具结合ssh和 cron可以实现多次数据的备份。
Rsync可以轻松实现完全和增量备份。
3.代码实现:
#!/bin/bash
LOCK=/tmp/lock
touch $LOCK
ERRLOCK=11
if [ -f $lock] ; then
exit echo $ERRLOCK;
fi
/usr/bin/rsync –
zrtpogv
–delete –password-file= /etc/rsyncd.passwd

user@x.x.x.x:
\
/home/backupdir
rm $lockLOCK

原创文章,转载请注明: 转载自亿唐网

本文链接地址: bash shell 中date时间戳的妙用

posted @ 2012-07-09 15:48  陳聽溪  阅读(1013)  评论(0)    收藏  举报