每日一练(linux)第六天

79 阅读3分钟

「这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战

1.只查看ett.txt文件(共100行)内第20到第30行的内容 创建模拟环境创建50行信息 seq 50 >/root/data/ett.txt

 第一种方式:利用sed命令取行
   [root@fu ~]# sed -n '20p' /root/data/ett.txt
   20
   [root@fu ~]# sed -n '20,30p' /root/data/ett.txt
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
 第二种方法:利用awk命令取行
   [root@fu ~]# awk 'NR==20' /root/data/ett.txt
   20
   [root@fu ~]# awk 'NR==20,NR==30' /root/data/ett.txt
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
第三种方法:利用grep命令
   从开头取
   [root@fu ~]# grep '20' /root/data/ett.txt
   20
   [root@fu ~]# grep -A10 '20' /root/data/ett.txt
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
  从末尾取
   [root@fu ~]# grep '30' /root/data/ett.txt
   30
   [root@fu ~]# grep -B10 '30' /root/data/ett.txt
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
  从中间取
   [root@fu ~]# grep '25' /root/data/ett.txt
   25
   [root@fu ~]# grep -C5 '25' /root/data/ett.txt
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
 第四种方法:利用好head和tail命令
   [root@fu ~]# head -30  /root/data/ett.txt|tail -11
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30

问题: $()和``不能在head和tail里面用

   [root@fu ~]# tail -11 $(head -30  /root/data/ett.txt|tail -11)
   tail: option used in invalid context -- 1
   [root@fu ~]# tail -11 `head -30  /root/data/ett.txt|tail -11`
   tail: option used in invalid context -- 1
   
  第五种方法:利用vim命令显示行号信息
  在vim命令编辑模式显示行号信息
  :set nu(number)     显示行号设置
  :set nonu(no number) 取消行号显示设置
  

2.把/oldboy目录及其目录下所有以扩展名.sh结尾的文件中, 文件包含oldboy的字符串全部替换为oldgirl(后面讲) 创建模拟环境

 mkdir -p /oldboy/test
     cd /oldboy
     echo "oldboy" >/oldboy/test/del.sh
     echo "oldboy" >test.sh
     echo "oldboy" >t.sh
     touch oldboy.txt
     touch alex.txt
 解决问题:
	 第一步:找出相应以.sh结尾的文件 
      [root@fu oldboy]# find /oldboy/ -type f -name "*.sh"
      /oldboy/t.sh
      /oldboy/test.sh
      /oldboy/test/del.sh
      
	 
	 第二步:将找出的文件中oldboy信息修改替换为oldgirl
     # sed 's#要替换的内容#替换成什么信息#g' /oldboy/test/del.sh
     [root@fu oldboy]# sed 's#oldboy#oldgirl#g' /oldboy/test/del.sh (模拟的操作  文件并没有修改)
     oldgirl
     [root@fu oldboy]# cat /oldboy/test/del.sh
     oldboy
     [root@fu oldboy]# sed -i 's#oldboy#oldgirl#g' /oldboy/test/del.sh
     [root@fu oldboy]# cat /oldboy/test/del.sh
     oldgirl

补充:利用sed命令修改文件时,规范使用方法 01.在修改前,先模拟执行测试替换功能(不要直接加上-i参数) 02.在修改前,进行文件备份 sed -i.bak 's#oldgirl#oldboy#g' /oldboy/test/del.sh 说明:-i 参数后不要再接上任何其他参数信息,其他参数要写在-i参数之前

 第三步,将第一步和第三步命令进行结合
 第一种结合方式
 find /oldboy/ -type f -name "*.sh"|xargs  sed -i 's#oldboy#oldgirl#g' /oldboy/test/del.sh
 [root@fu oldboy]# find /oldboy/ -type f -name "*.sh"|xargs  sed -i 's#oldboy#oldgirl#g' /oldboy/test/del.sh
 [root@fu oldboy]# find /oldboy/ -type f -name "*.sh"|xargs cat
 oldgirl
 oldgirl
 oldgirl
 [root@fu oldboy]# find /oldboy/ -type f -name "*.sh"|xargs  sed -i 's#oldgirl#oldboy#g' /oldboy/test/del.sh
 [root@fu oldboy]# find /oldboy/ -type f -name "*.sh"|xargs cat
 oldboy
 oldboy
 oldboy
 
 第二种结合方式
 sed -i 's#oldboy#oldgirl#g' /oldboy/test/del.sh $(find /oldboy/ -type f -name "*.sh")
 [root@fu oldboy]# sed -i 's#oldboy#oldgirl#g' /oldboy/test/del.sh $(find /oldboy/ -type f -name "*.sh")
 [root@fu oldboy]# cat  $(find /oldboy/ -type f -name "*.sh")
 oldgirl
 oldgirl
 oldgirl

第三种结合方式
find /oldboy/ -type f -name "*.sh" -exec  sed -i 's#oldgirl#oldboy#g' {} \;
[root@fu oldboy]# find /oldboy/ -type f -name "*.sh" -exec cat {} \;
oldboy
oldboy
oldboy