一、问题
1.1 统计脚本执行时间
如何统计脚本执行的时间?
1.2 让rm命令失效
要求用命令rm删除文件时提示如下禁止使用rm的提示,并使该效果永久生效。
[root@oldboy oldboy]# rm -f passwd
Do not use rm command.
1.3 删除文件
删除/tmp/oldboy/下除passwd以外的其他文件。
1.4 打印
请打印/etc/passwd文件中的第2-5行
1.5 调换列
调换passwd文件里root位置和/bin/bash位置?即将所有的第一列和最后一列位置调换?
例:
默认:root:x:0:0:root:/root:/bin/bash
修改后:/bin/bash:x:0:0:root:/root:root
1.6 替换
把/tmp/oldboy目录及其子目录下所有以扩展名.txt结尾的文件中包含oldgirl的字符串全部替换为oldboy。
1.7 查找
查找/tmp/oldboy下所有7天以前以log结尾的大于1M的文件移动/tmp下
二、答案
2.1
# 说明
# real指命令从开始到结束的时间
# user指用于执行进程所花费的时间
# sys指在内核中执行系统调用所花费的时间,进程使用CPU的时间
2.2
echo 'alias rm="echo Do not use rm command."' >> /etc/profile
source /etc/profile
思路:通过设置rm别名实现
2.3
准备数据:
rm -rf /tmp/oldboy
mkdir /tmp/oldboy
cp /etc/passwd /tmp/oldboy/
touch /tmp/oldboy/tmp{1..5}.txt
touch /tmp/oldboy/tmp{1..5}.log
tree /tmp/oldboy/
答案:
# 使用xargs
find /tmp/oldboy/ -type f ! -name passwd | xargs rm -f
# 使用find参数
find /tmp/oldboy/ -type f ! -name passwd -exec rm -f {} ;
分析:
-type f 指定只查找文件
-name passwd 指定查找名为passwd,加!表示排除passwd
xargs 多行转1行
rm -f 强制删除
find的-exec参数
{} ; 这是固定写法
2.4
# awk
awk 'NR>1 && NR<6{print NR, $0}' /etc/passwd
# sed
sed -n '2,5p' /etc/passwd
# head/tail
head -5 /etc/passwd | tail -4
分析:
# awk
NR是awk的内置变量表示行数
# sed
参考 sed速查手册
2.5
awk -F: '{print $7FS$2FS$3FS$4FS$5FS$6FS$1}' /etc/passwd
分析:
FS是awk的内置变量表示列之间的分隔符
2.6
准备数据:
rm -rf /tmp/oldboy
mkdir /tmp/oldboy
touch /tmp/oldboy/{1..2}.txt
touch /tmp/oldboy/{1..2}.log
echo 'hello oldgirl' > /tmp/oldboy/1.txt
echo 'hello oldgirl' > /tmp/oldboy/2.txt
echo 'hello oldgirl' > /tmp/oldboy/1.log
echo 'hello oldgirl' > /tmp/oldboy/2.log
find /tmp/oldboy/ -type f | xargs -I {} cat {}
答案
find /tmp/oldboy/ -type f -name '*.txt' | xargs sed -i 's/oldgirl/oldboy/g'
# 查看
find /tmp/oldboy/ -type f -exec cat {} ;
分析:使用sed的替换功能
2.7
模拟环境:
rm -rf /tmp/oldboy
mkdir /tmp/oldboy
dd if=/dev/zero of=/tmp/oldboy/test1.log bs=1k count=1023
dd if=/dev/zero of=/tmp/oldboy/test2.log bs=1k count=1024
dd if=/dev/zero of=/tmp/oldboy/test3.log bs=1k count=1025
dd if=/dev/zero of=/tmp/oldboy/test4.log bs=1k count=1025
touch /tmp/oldboy/test3.log -m -d '20180101'
答案:
find /tmp/oldboy/ -type f -name '*.log' -size +1M -mtime +7 -exec mv {} /tmp ;
分析:
# 查看文件的时间
stat test1.log
atime 文件最近访问的时间
mtime 文件的内容最近修改的时间
ctime 文件属性最近修改的时间
当文件的目录被修改或文件的所有者、权限等被修改时ctime也会更新
# 修改文件的时间 mtime
touch test1.log -m -d '20180101'