linux - 练习题 - 01
1.创建目录,增加内容,复制 (mkdir / echo >> / cat ...<<EOF / 漏斗家族)
创建一个目录 /data
在 /data下面创建文件oldboy.txt
为oldboy.txt增加内容“I am studying linux”
# 方法1: mkdir /data touch /data/oldboy.txt ls -l /data vim /data/oldboy.txt ( i / I am studying linux / esc / :wq ) cat /data/oldboy.txt
# 方法2:(echo >>) [root@oldboyedu-01 data]# echo hello oldboylinux hello oldboylinux root@oldboyedu-01 data]# echo hello oldboylinux >>/data/oldboy.txt [root@oldboyedu-01 data]# cat /data/oldboy.txt I am studying linux hello oldboylinux
# 方法3:(多行 cat..<<EOF) [root@oldboyedu-01 data]# cat >>/data/oldboy.txt <<EOF > I > am > studing > linux > EOF [root@oldboyedu-01 data]# cat /data/oldboy.txt I am studing linux hello nihao I am studing linux -------------------------------- # 漏斗家族 重定向符号 echo hello echo hello >> /data/oldboy.txt
> 1> 标准输出重定向 先把文件的内容清空 把内容放到文件的最后一行 >> 1>> 追加重定向 把内容放到文件的最后一行 2> 标准错误重定向 2>> 错误追加重定向 < 输入重定向 << 追加输入重定向 # 同时把对的 错误 都进到文件中 [root@oldboyedu-01 data]# ech hi >>/data/oldboy.txt 2>>/data/oldboy.txt [root@oldboyedu-01 data]# ech hi >>/data/oldboy.txt 2>&1 [root@oldboyedu-01 data]# echo hello oldboy >/data/oldboy.txt [root@oldboyedu-01 data]# cat oldboy.txt hello oldboy [root@oldboyedu-01 data]# ech hi >>/data/oldboy.txt 2>>/data/oldboy.txt [root@oldboyedu-01 data]# cat oldboy.txt hello oldboy nihao -bash: eho: command not found -bash: eho: command not found world -bash: ech: command not found [root@oldboyedu-01 data]# echo 1 2 3 4 5 >/data/num.txt [root@oldboyedu-01 data]# ls -l total 12 -rw-r--r--. 1 root root 10 Jul 9 17:53 num.txt -rw-r--r--. 1 root root 50 Jul 9 17:42 oldboy.txt -rw-r--r--. 1 root root 6 Jul 9 17:46 test.txt [root@oldboyedu-01 data]# xargs </data/num.txt 1 2 3 4 5 [root@oldboyedu-01 data]# xargs -n2 </data/num.txt 1 2 3 4 5
2.把/data/oldboy.txt复制到/tmp下(cp)
# 复制:(cp ) [root@oldboyedu-01 data]# cp /data/oldboy.txt /tmp/ [root@oldboyedu-01 data]# ls -l /tmp/ total 4 -rw-r--r--. 1 root root 146 Jul 9 04:12 oldboy.txt -rw-------. 1 root root 0 Jul 8 23:02 yum.log # 备份:(cp .. ..) [root@oldboyedu-01 tmp]# cp /data/oldboy.txt /data/oldboy.txt.bak [root@oldboyedu-01 tmp]# ls -l /data/ total 12 -rw-r--r--. 1 root root 10 Jul 9 04:04 num.txt -rw-r--r--. 1 root root 146 Jul 9 04:01 oldboy.txt -rw-r--r--. 1 root root 146 Jul 9 04:16 oldboy.txt.bak # 复制目录及目录下的内容:(cp -r .. .) [root@oldboyedu-01 data]# cp -r /data/ /tmp/ [root@oldboyedu-01 data]# ls -l /tmp/ total 8 drwxr-xr-x. 2 root root 4096 Jul 9 04:21 data -rw-r--r--. 1 root root 146 Jul 9 04:12 oldboy.txt -rw-------. 1 root root 0 Jul 8 23:02 yum.log [root@oldboyedu-01 data]# cp -a /data/ /opt/ [root@oldboyedu-01 data]# ls -l /opt/ total 8 drwxr-xr-x. 2 root root 4096 Jul 9 04:16 data drwxr-xr-x. 2 root root 4096 Mar 26 2015 rh cp 复制文件或目录 默认无法复制目录 -r 递归复制 复制目录及目录里面的内容 -p 复制的时候保持属性不变 -a (-pdr) 复制所有# 复制:(cp )
3.把/data移动到/root目录下 (mv)
[root@oldboyedu-01 ~]# mv /data/ /root/ [root@oldboyedu-01 ~]# ls -l /root/ total 44 -rw-------. 1 root root 1061 Jul 8 23:13 anaconda-ks.cfg drwxr-xr-x. 2 root root 4096 Jul 9 04:16 data -rw-r--r--. 1 root root 21736 Jul 8 23:13 install.log -rw-r--r--. 1 root root 5890 Jul 8 23:12 install.log.syslog [root@oldboyedu-01 ~]# ls -l /data/ ls: cannot access /data/: No such file or directory
4.进入/root目录下的data目录,删除oldboy.txt文件 (rm)
rm 不能删目录 rm -r data rm -rf data # 很危险 rm -r 递归删除 -f 强制删除 [root@oldboyedu-01 tmp]# rm data rm: cannot remove `data': Is a directory [root@oldboyedu-01 tmp]# rm -r data rm: descend into directory `data'? n [root@oldboyedu-01 tmp]# rm -r data rm: descend into directory `data'? y rm: remove regular file `data/oldboy.txt'? n rm: remove regular file `data/oldboy.txt.bak'? n rm: remove regular file `data/num.txt'? n rm: remove directory `data'? n [root@oldboyedu-01 tmp]# [root@oldboyedu-01 tmp]# rm -rf data/ [root@oldboyedu-01 tmp]# ls -l total 4 -rw-r--r--. 1 root root 146 Jul 9 04:12 oldboy.txt -rw-------. 1 root root 0 Jul 8 23:02 yum.log
5.find命令 管道 | ,通过管道传递给后面的命令 ( find | )
find 查找文件 find 哪里找 什么类型 什么名字 -type 找什么类型的 f file 文件 d directory 目录 -name 什么名字 “*.txt” [root@oldboyedu-01 tmp]# find /root/ -type f -name "oldboy.txt" [root@oldboyedu-01 tmp]# touch /root/data/oldboy.txt [root@oldboyedu-01 tmp]# find /root/ -type f -name "oldboy.txt" /root/data/oldboy.txt [root@oldboyedu-01 tmp]# find /root/ -type f -name "*.txt" /root/data/oldboy.txt /root/data/num.txt 管道 | 作用:把前面命令的结果通过管道传递给后面的命令 [root@oldboyedu-01 tmp]# find /root/ -type f -name "oldboy.txt"|xargs ls -l -rw-r--r--. 1 root root 0 Jul 9 05:06 /root/data/oldboy.txt
6.退出到上一级目录 删除data目录 原来在/root/data(cd)
[root@oldboyedu-01 tmp]# cd /root/data [root@oldboyedu-01 data]# pwd /root/data [root@oldboyedu-01 ~]# ls anaconda-ks.cfg data install.log install.log.syslog [root@oldboyedu-01 ~]# rm data/ -rf [root@oldboyedu-01 ~]# ls anaconda-ks.cfg install.log install.log.syslog
7.已知文件test.txt内容,输出文件内容时,不要oldboy的字符串 (grep head tail awk sed )
[root@oldboyedu-01 ~]# cat >/data/test.txt<<EOF > test > liyao > oldboy > EOF [root@oldboyedu-01 ~]# cat /data/test.txt test liyao oldboy # 方法1:grep -v [root@oldboyedu-01 data]# grep "oldboy" test.txt oldboy [root@oldboyedu-01 data]# grep "ol" test.txt oldboy [root@oldboyedu-01 data]# grep -v "oldboy" test.txt test liyao # 方法2: head 取出前2行 tail 取出后几行 [root@oldboyedu-01 data]# head -n2 test.txt test liyao [root@oldboyedu-01 data]# tail -2 test.txt liyao oldboy [root@oldboyedu-01 data]# tail -1 test.txt oldboy # 方法3: awk ! [root@oldboyedu-01 data]# awk "/oldboy/" test.txt oldboy [root@oldboyedu-01 data]# grep "oldboy" test.txt oldboy [root@oldboyedu-01 data]# awk '!/oldboy/' test.txt (单引号) test liyao # 方法4: sed /d删掉 [root@oldboyedu-01 data]# sed '/oldboy/d' test.txt test liyao
8.请用一条命令完成创建目录 /oldboy/test (mkdir -p/-pv)
mkdir 一次只能创建一个 mkdir -p 创建多层目录 mkdir -pv 可查看创建的过程 [root@oldboyedu-01 data]# mkdir /oldboy/test mkdir: cannot create directory `/oldboy/test': No such file or directory 1.ls 命令一层一层查看 2.查看每一层目录是否存在 [root@oldboyedu-01 ~]# mkdir -p /oldboy/test [root@oldboyedu-01 ~]# ls -l /oldboy total 4 drwxr-xr-x. 2 root root 4096 Jul 9 06:05 test root@oldboyedu-01 test]# mkdir -pv /oldboy/test/a/b/c mkdir: created directory `/oldboy/test/a' mkdir: created directory `/oldboy/test/a/b' mkdir: created directory `/oldboy/test/a/b/c'
9.覆盖文件提示(cp \cp /bin/cp 别名(alias echo vim /etc/profile source /root/.bashrc )-- 配置别名 4个步骤)
已知/tmp/下已经存在test.txt文件 如何执行命令 才能把/mnt/test.txt拷贝到/tmp/下覆盖掉
/tmp/test.txt,而让系统不提示是否覆盖(root权限下)
如何不提示,直接覆盖
[root@oldboyedu-01 test]# touch /tmp/test.txt /mnt/test.txt [root@oldboyedu-01 test]# cp /mnt/test.txt /tmp/ cp: overwrite `/tmp/test.txt'? ^C [root@oldboyedu-01 test]# # 方法1 反斜线 -i [root@oldboyedu-01 test]# cp /mnt/test.txt /tmp cp: overwrite `/tmp/test.txt'? ^C [root@oldboyedu-01 test]# \cp /mnt/test.txt /tmp [root@oldboyedu-01 test]# [root@oldboyedu-01 test]# \cp -i /mnt/test.txt /tmp cp: overwrite `/tmp/test.txt'? ^C # 方法2 使用命令的绝对路径 全路径 [root@oldboyedu-01 test]# which mkdir /bin/mkdir [root@oldboyedu-01 test]# which cp alias cp='cp -i' /bin/cp [root@oldboyedu-01 /]# cp /mnt/test.txt /tmp cp: overwrite `/tmp/test.txt'? ^C [root@oldboyedu-01 test]# /bin/cp /mnt/test.txt /tmp/
思考: 为什么要提示,提示
提示你是否覆盖?功能很好, 在rm 问你是否删除,提示的功能是谁完成的呢
为何 我们执行 cp的时候 就相当于 cp -i
为何我们执行 rm 的时候 就相当于 rm -i
linux别名 (昵称)
1.目标:防止运行危险命令
2.省事 简化命令
如何设置别名? # 1. 查看系统中别名 (alias) [root@oldboyedu-01 test]# alias alias cp='cp -i' alias l.='ls -d .* --color=auto' alias ll='ls -l --color=auto' alias ls='ls --color=auto' alias mv='mv -i' alias rm='rm -i' alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' [root@oldboyedu-01 test]# alias rm cp mv alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' [root@oldboyedu-01 test]# # 2. 模仿 (执行rm 命令的时候提示 do not use rm ) [root@oldboyedu-01 test]# echo do not use rm do not use rm [root@oldboyedu-01 test]# alias rm='echo do not use rm' [root@oldboyedu-01 test]# alias rm alias rm='echo do not use rm' [root@oldboyedu-01 test]# rm /tmp/test.txt do not use rm /tmp/test.txt [root@oldboyedu-01 test]# rm -rf /tmp/test.txt do not use rm -rf /tmp/test.txt [root@oldboyedu-01 test]# # 3.永久生效 (写到文件中)(vim source) # /etc/profile # vim 快捷键 # 移动光标到最后一行 G # 光标移到文件的第一行 gg # 在光标所在的位置 的下一行 插入一个空行 并进入编辑模式 o(小写字母) [root@oldboyedu-01 test]# vim /etc/profile 。。。 alias rm='echo do not use rm' "/etc/profile" 79L, 1871C written [root@oldboyedu-01 test]# tail -1 /etc/profile alias rm='echo do not use rm' [root@oldboyedu-01 test]# source /etc/profile # 命令运行到内存里,需要永久保存,vim source [root@oldboyedu-01 test]# alias rm alias rm='echo do not use rm' # 这样 alias rm 别名就很好使了 [root@oldboyedu-01 test]# ls -l /tmp/ total 0 -rw-r--r--. 1 root root 0 Jul 9 06:32 test.txt -rw-------. 1 root root 0 Jul 8 23:02 yum.log [root@oldboyedu-01 test]# rm /tmp/test.txt do not use rm /tmp/test.txt # 4.一个坑,rm cp mv 还需要改一个地方,才能永久生效 ( /root/.bashrc ) [root@oldboyedu-01 test]# vim /root/.bashrc # alias rm='rm -i' (需要这样) # 注掉之后,才能 永久生效 alias cp='cp -i' alias mv='mv -i' 这三个 起了别名也不认 [root@oldboyedu-01 ~]# alias rm alias rm='rm -i' # 断开在连 就可以了 [root@oldboyedu-01 ~]# alias rm alias rm='echo do not use rm'
10.查看ett.txt文件(共100行),第20-30行的内容,通过命令取出文件的某一行或者连续的几行(seq sed head tail awk grep )
# 方法1 (seq sed ) 取出某一行 或者连续的几行 [root@oldboyedu-01 ~]# seq 10 1 2 3 4 5 6 7 8 9 10 [root@oldboyedu-01 ~]# seq 100 >/oldboy/ett.txt [root@oldboyedu-01 ~]# sed -n '20p' /oldboy/ett.txt 20 [root@oldboyedu-01 ~]# sed -n '20,30p' /oldboy/ett.txt 20 21 22 23 24 25 26 27 28 29 30
# 方法2 ( head 管道 tail ) 管道 [root@oldboyedu-01 ~]# head -30 /oldboy/ett.txt|tail -11 20 21 22 23 24 25 26 27 28 29 30
# 方法3: (awk NR) NR==20 行号是20 [root@oldboyedu-01 ~]# awk "NR==20" /oldboy/ett.txt 20 [root@oldboyedu-01 ~]# awk "NR==20,NR==30" /oldboy/ett.txt 20 21 22 23 24 25 26 27 28 29 30
# 方法4:( grep -A10) 文件的内容 === 等于这一行的行号 -A 显示之下的,-B显示之上的 -C显示上下的 [root@oldboyedu-01 ~]# grep "20" /oldboy/ett.txt 20 [root@oldboyedu-01 ~]# grep -A10 "20" /oldboy/ett.txt 20 21 22 23 24 25 26 27 28 29 30
11.替换(三步:1. 找文件 find 2. 替换 sed 3. 替换全部 find |xargs sed)
把/oldboy目录及其子目录下所有以扩展名.sh 结尾的文件中 。文件包含oldboy的字符串全部替换为oldgirl
创建环境: mkdir -p /oldboy/test cd /oldboy echo "oldboy">test/del.sh echo "oldboy">test.sh echo "oldboy">t.sh touch oldboy.txt touch alex.txt [root@oldboyedu-01 oldboy]# find . ./t.sh ./ett.txt ./test ./test/help ./test/del.sh ./test.sh ./oldboy.txt ./tets ./alex.txt [root@oldboyedu-01 oldboy]# cat t.sh oldboy
# 第一步:找文件 [root@oldboyedu-01 oldboy]# find /oldboy/ -type f /oldboy/t.sh /oldboy/ett.txt /oldboy/test/del.sh /oldboy/test.sh /oldboy/oldboy.txt /oldboy/alex.txt [root@oldboyedu-01 oldboy]# find /oldboy/ -type f -name "*.sh" /oldboy/t.sh /oldboy/test/del.sh /oldboy/test.sh # 第二步:替换一个 (sed -i 's#oldboy#oldgirl#g' /oldboy/t.sh) sed 's#oldboy#oldgirl#g' /oldboy/t.sh 没有办法直接改文件 防止做傻事 除了 vi vim sed -i (替换) [root@oldboyedu-01 oldboy]# cat /oldboy/t.sh oldboy [root@oldboyedu-01 oldboy]# sed "s#找谁#替换为什么#g" oldboy/t.sh [root@oldboyedu-01 oldboy]# sed 's#oldboy#oldgirl#g' /oldboy/t.sh oldgirl [root@oldboyedu-01 oldboy]# cat /oldboy/t.sh oldboy [root@oldboyedu-01 oldboy]# sed -i 's#oldboy#oldgirl#g' /oldboy/t.sh [root@oldboyedu-01 oldboy]# cat /oldboy/t.sh oldgirl # 第三步:替换全部 把find命令找到的文件交给sed命令处理 [root@oldboyedu-01 oldboy]# find /oldboy/ -type f -name "*.sh"|xargs sed 's#oldboy#oldgirl#g' -i [root@oldboyedu-01 oldboy]# find /oldboy/ -type f -name "*.sh"|xargs cat oldgirl oldgirl oldgirl