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

 

 
 
 
posted @ 2018-07-10 18:08  Alice的小屋  阅读(164)  评论(0编辑  收藏  举报