linux 笔记

                                                    《快乐的linux命令行》学习笔记

1.linux 目录形式
     \  (根目录)
       -boot
       -bin
       -usr
       -...
       -home 
        - xiaoming
        - xiaowang
        - ...
        - xiaocao  
         -Proj
         -...
         -daydayup
       
 上一级 称之为 "父目录" , 下一级 称之为 ”子目录“.  (路径名字,其实大小写是敏感的,因此不推荐重名)


相对路径表示:"." 和 ".." : 其中 "."表示目前路径;   ".."表示上一级目录


cd 命令:既可以用绝对路径(始于根\),也可以用 相对路径". .."
特殊的 "cd"    进入自己的home
       "cd -"  进入刚才的工作路径,即上一次的
       "cd ~xiaoming" 进入xiaoming的home。
       
2.机器man 用不了,一般是没有manpage.可以用 ls --help.来替代查询。


3.mv dir 操作时,不需要加 递归-r



1. ls -lh  参数h配合l,将文件大小以 K、M、G的形式显示。更加直观

    ls -l命令显示结果

total 1.4M
drwxr-xr-x  6 caokang caokang 4.0K Apr  2 13:19 admin
-rw-rw-r--  1 caokang caokang 1.3M Apr  2 13:21 install.log

第一个字符"d"表示是 一个路径 ; "-"表示是一个文件。它没有子路径了。

第一个caokang表示 文件所有者。 其权限是rwx        第二个caokang表示 小组名。其权限是r-x. 最后的r-x表示其他人的权限。即:从左到又,也对应其权限。   

再往又,就是文件大小,已经文件夹名\或者文件名称.

<第五章: 操作文件和目录>

1. mkdir directionary ...

  语法是创建一个目录.名字为 "directionary".其尾缀 三个点,表示,"directionary".是可以重复的.

即 mkdir dir1 dir2 dir3 等于创建三个路径.

2. man cp 发现其语法介绍

   Copy SOURCE to DEST or multiple SOURECE(s) to DIRECTORY

       cp [OPTION]... [-T] SOURCE DEST
       cp [OPTION]... SOURCE... DIRECTORY
       cp [OPTION]... -t DIRECTORY SOURCE...

我们捡常用的来分析.   [OPTION] 后缀三个点。表示这个选型是 可以叠加的。

SOURCE也尾缀三个点,即可以 把多个文件 拷贝到  某一路径下面。(注意 DIRECTORY 和DEST的区别)


举例:  cp file1 file2 把file1 拷贝成file2.   这样,每次重复copy都会直接覆盖file2.

           cp -i  file1 file2 覆盖前会询问下.

         -r 为递归copy,常用.  

         -u 为 升级补漏.


2 mv 操作    

mv 跟cp很相似,但是 mv是剪切.

mv file1 file2  相当于剪切flie1 ,贴到file2.在一个路径下,就相当于 renameq

mv dir1 dir2 剪切路径,注意这个时候不需要加 -r选项.跟cp有些区别


3 rm操作

 linux下,有事就找男人(man)帮忙 

 rm [OPTION] ... FILE...

rm 常用选项: -i  提示信息、 -f强制操作(即使不存在该文件或者 unwritealbe,依旧删除并往下进行) -r 递归.  三个点 代表可以重叠使用

FILE 也可以重复. 比如  rm -fir  file1 dir1   删除文件file1清空路径dir1.

特别注意: linux下没有恢复功能,找man也没戏。所以慎用rm -r * 这类的操作。我之前就rm过 home下面的东西.


4. ln链接操作/

  链接分为硬链接和软链接(加参数-s soft).

语法: ln (-s )  Filename  ln_ID

 硬\软链接会生成如下的文件:

-rw-rw-r-- 2 caokang caokang 14 Apr 10 23:07 a.v
lrwxrwxrwx 1 caokang caokang  3 Apr 10 23:09 bhard -> b.v
-rw-rw-r-- 1 caokang caokang  0 Apr 10 23:04 b.v
-rw-rw-r-- 2 caokang caokang 14 Apr 10 23:07 hard1

若使用vm 对hard1.v 或者bhard 进行编辑, 都会反馈到 a.v或者b.v文件中. 删除ln_ID,均不会对文件造成影响.



<第六章 使用命令》


1.命令 如cd \ls\rm等,其实都是由C或者C++语言写成的函数。在使用时,相当于调用,并附加以参数。


2.命令参数后 【 l | p 】这种情况,代表 参数l、p只能出现一个。


3.命令行 一行可以输入多个命令;
 比如  $ cd /usr/bin;ls;cd -  
 这个过程是 先进入 /usr/bin/ 。然后显示所有文件。再然后 cd - 返回原来的路径。


4.为了节省输入.可以自己创建一个 叫 lsbin的命令。来替代 cd /usr/bin;ls;cd -  这一个过程。


首先 type lsbin 。会反馈告诉你lsbin是不是一个已经存在的命令。


如果不是,我们就第二步,  alias lsbin=‘ cd /usr/bin;ls;cd -’


这之后,我们再用 type lsbin,就能看到  lsbin is alaised to ‘ cd /usr/bin;ls;cd -’


同时我们在命令行中输入  $ lsb,会自动补全lsbin,即代表lsbin成了一个新的命令了。可以直接调用了


alias -p 可以看到所有 通过alias的命令。


好了,当我们不需要lsbin这个命令之后, 我们可以用unalias lsbin 就会删除这个alias.即命令失效.
 
同样的这个操作,只在本次的中断内有效.



<第七章  重定向>

前半部分

1.重定向标准输出   >  .比如 $: ls -l /usr/bin > lsout.txt 每次执行时,都会把ls -l /usr/bin的结果 ,写入lsout.txt文件中
多次执行,每次都会重写覆盖。
如果想每次都把命令运行结果,追尾写。可以使用 >>
2. cat [OPTION]... [File]...  命令用途: 连接多个文件/标准输入 ,输出到标准输出。
   cat file1 file2 : 就是把文件file1\file2,连接起来,输出到标准输出(屏幕)
   cat file2 file2 > out.txt 就是把文件file1\file2,连接起来,输出到标准输出(被修改制定为文件out.txt)
   cat >out.txt :  可以看到 cat空(或者-)。就好似cat标准输入(键盘),输出到out.txt文件。
      这个需要注意的是,标准输入时, 需要Ctrl+d。提示输入完毕。
   cat file1 - file2  >out.txt : 相当于三个输入,依次为file1、键盘、file2 .将这些东西连接在一起,输出至out.txt  

   其中{OPTION]选项 主要有 

           -A   :  打印输出所有符号,(包括 table ^I    和 换行$

           -n   :  打印行号

           -s   : 压缩空白行,即多个空白行,只输出一个。





3. wc -l filename : 统计一个文件的行数


4. grep 是个很强大的命令。


5. a | b | c  命令a,输出结果转接给 b,进过一定的处理,再送给c。
              这个时候,怎么确认命令b,执行是对的呢? 加入了一个tee命令
              tee [OPTION]...[FILE]...      把 tee 输入,copy 到 FILE里面去。
              这样 a | b | tee tmp.txt | c  : 这个命令的效果    a | b | c
                   /\
                      屏幕
       就是把b的结果 复制一份 到 屏幕上(或者一个tmp文件中).


后面部分:

1. | 管道.   a | b 相当于把a命令的输出结果,连接给 命令b,作为其输入。

    所以 a |  cmd b | c : 这里面的command b就相当于一个滤波器。 把 a的结果,经过一定处理,再输送给c。

2. sort 命令。

记得在 tcl语言中碰到过 lsort,  把list的内容按照 asic increasing 、descreasing排序等情况。


sort 就是linux中,用于排序的命令. (以行为单位,进行排序)

 sort  [OPTION] ... [FILE] ...   命令功能: 以行为单位,把文件排序结果输出到 标准输出(屏幕)。


参数我们不太可能面面俱到.下面捡几个重要的.


-u  :  unique 如果行中,出现了一模一样的行. 就会删除一行.

-r  : reverse  进行反向排序

从命令功能中看出,sort结果会输出到 标准输出中,如果想用一个文件存储,就要使用 重定向>


有时候,我们想把 sort的结果,直接覆盖原来的文件.   这时候用重定向,就不行了.  -o  参数就开始发挥作用了        sort  -u test,v -o  test.v 


按数字排序. 如果  

11

101

 2

3

排序.结果 会是 

101

11

2

3.

相当于按照 ASCii 排序,  先比较第一个\排好,在比第二个. 不应定说谁长,谁就排后面

此时不是我们所想的  因为有可能是 十进制码数字,  这时候, 加入参数 -n 就可以解决.


再讲述 -k 和 -t  选项

例题:

我们有个文件 :  

banana:30:5.5
apple:10:2.5
pear:90:2.3
orange:20:3.4

第一个水果种类,第二个是个数. 最后是单价.

我们想 用 个数来排序.

因为 文件, 种类\个数\单价用冒号分离了.  我们使用 -t : 来表明 分号是分隔符. 这样 每行分割成 POS1 : POS2:POS3

-k 2 .制定比较开始 适用于POS2.


$ sort   -n -t : -k 2 test,txt  -o  test,

apple:10:2.5
orange:20:3.4
banana:30:5.5
pear:90:2.3


默认情况下  -t 是指空格.  每行的  pos1 pos2 pos3 pos4 可以直接指定




<第八章> 常见的linux符号使用.

1. ~:符号。在前面说过   ~后如果什么都不跟,就是进入自己的home。

~后跟xiaoming,就进入了小明的home

2.$ 符号是置换符号, 能把很多表达式的值,置换出来,但是在公司电脑里面就是不行, 家里的pc可以. 感觉是 eda工具吧$什么东西变成了它的 语法参数.


3.{1,2,3} 相当于是个列表,会逐一取list值,套入命令中执行.

    mkdir {a,b}{1,2} 就会产生四个路径: a1、a2、b1、b2.  这个命令可以批量的创建很多目录.


《第九章: 在命令行中,怎么减少鼠标的使用》

1. 新开terminal  : ctrl+shift+t

2.关闭该terminal: ctrl+d (等于输入 exit)

3. 清空该 terminal :ctrl+l (非i)(等于输入 clear)

4.已经输入一些 东西了.发现输错了.

   ctrl+ a: 光标移动到 命令行头

  ctrl+e :光标移动到 命令行尾

  ctrl+f : 光标前移1 forward

  crtl+b :光标后移1 backward

 ctrl+d :删除光标的字母. (delete)

  ctrl+k: 剪切光标到行尾.

 ctrl+u: 剪切光标到 行头

 ctrl+y: 粘贴


5. history 命令.

这个命令会列出 我们所使用过的命令. 不用你在一个一个的用箭头去翻看了.

直接history 他就会显示出来.不过有个弊端 .它会把所有的都显示出来.

但是有时我们根本不需要那么多, 所以  history 10 就只显示出10个最近使用的命令了。

最近10个命令:

    6  cd dir2
    7  ;;
    8  ll
    9  cd ../dir1
   10  ll
   11  vim a
   12  ll
   13  history 
   14  history 10
   15  history 10

我们想使用 #9号. 那么使用    !9就可以了.


当然了,history | grep  xxx  也是可行的。帮助从几百行的history中挑出你想要的



 <第十章  linux 权限 管理>


1. chmod 命令 控制 usr group other的  rwx权限。
常用两种用法:  chmod 777 fliename: 把权限都赋予 rwx。
   chmod u+x,g-rw,o-rw fliname  给usr增加执行,group other都删掉rw权限。
   chmod u=rwx filename usr权限直接赋予rwx
   


2. umask 控制 新建的目录/文件的 默认属性。
   
   规则: umask = 22
   
 umask存储的是补码。                      
   rwx rwx rwx                           rw- rw- rw- 
  000 010 010                         000 010 010  ( 可以用 umask 0 修改成 000 000 000)
  -------------                               -------------
   rwx r-x r-x                              rw- r-- r--
   
其中新建的路径 都是有x权限.    然而新建的文件,是默认没有x权限的。




如果想修改 umask 值,可以直接  umask 000。这样 新建出来的路径都是 777权限,新建的文件都是666权限。




但是 很多情况下,我们没有必要去修改这些参数。直接使用 chmod 新增一部分就好了。




<第11章,进程管理>

1. ps 命令:  显示目前terminal所运行的 所有 进程.

2. ctrl+c 会终止任意命令,如verdi3

3. 如果想让一个命令运行在后台, 则 末尾加上 & .之后 运行后 按下Enter键后,shell依旧可以输入命令.

    但是此时, verdi进行后台了,我们怎么通过shell 来关闭它呢  ? 

    首先通过jobs 查看 目前shell窗口下面运行着什么 .比如我们一个shell下面 跑  dc_shell & 和 verdi & 

此时 jobs命令返回的结果是:

[caokang@caokang aaa]$ jobs
[1]-  Running                 verdi &
[2]+  Stopped                 dc_shell

先让他浮出水面, fb 1/或2   然后ctrl c 停止就或以。

4. 如果忘记 verdi 加& ,等其跑起来.我们可以 ctrl+z.使其进入后台,但是注意此时, verdi处于了 stopped状态,

 如果想让他重新工作起来,可以用bg 1.

即  如果忘记输入了 & : 可以用ctrl+c   bg命令替代。


《第十二章  shell环境 》

 1. terminal 仅仅是个界面而已。它把键盘的输入存入、显示;同时交给shell去解释、shell返回的结果再显示出来。(只显示标准输入和标准输出)

shell 是一类 解释型程序的总称呼.   主要包括有  sh 、bash、csh 等等。可以这样设想下:

C语言中有这样一种函数:  

     void   shell_bash   ( input  STDIN    output : Result )

     {

    //---------------------------------

     PC默认配置

   //----------------------------------

    case(STDIN)

      ls:   find ls -->   function(dispaly)     // 启用function___display

     cd:  find cd    function( enter into ) //启用function___ enter folder

     rm: find rm    function(delete file) //启用function___delete file 

     。。。。


      } 

可以这样说  shell_bash是一个函数,它把 STDIN 读入,然后解释STDIN,调用函数function.并把结果 送出(Result).


同时 人们为了更好的性能追求,在shell_bash这个经典的范本的基础上做了部分修改。演化出了  csh等。其实他们的工作原理都是一样的。


2.  环境变量和shell变量.

环境变量.是描述计算机基本信息的参数.比如Home路径、history_size 、 命令提示符  [caokang @ caokang Proj] $的显示格式定义。

这一类的计算机参数。以及各种PATH路径定义. 这些参数可以修改.但是必须等到我们十分熟悉的时候,再去修改每个环境变量.

shell变量呢,就可以十分随意了,比如 给字符串定义一个别名(alias),制定商用程序的启动路径之类的。这些参数往往处于 工作效率的考虑,

会经常的增减。但是目前我还不了解,如何定义一个shell变量? 什么时候定义? 定义的语法是什么 ?  希望以后了解 环境变量、shell变量之后再做补充。


3. 大致描述下 ls的工作原理。

键盘输入ls ---> 去PATH中去匹配查找----->找到了,执行该x文件,(结合目前系统的参数,logname\group信息),给出文件列表和 权限--->

输出到屏幕

启动商用程序(DC综合软件)过程

键盘输入dc_ck ---->去PATH中匹配查找----->找到了,它是shell变量” alias dc_ck = dc_shell“. ---->  再PATH中再去找dc_shell----->

找到了可执行的dc_shell文件,然后执行它.....     这样一个过程,其实相当于我们 在windows下面的 双击 程序exe快捷键.


<14章  shell提示符>
1. 我们直到 shell是一类,包括有bash、csh、dash等,他们内部定义的参数名其实是不太一样的。
   比如 bash里面  [caokang @ beken-4 case_adc] 这个参数:是整个提示符变量。在bash里面,它存储在PS1里面。
   然而在csh里面,这个变量名,变成了 prompt.(所以你在csh里面,echo $PS1 会报错)。


2. 以上的知识,应该帮助我们理解为何  有时候 书本上的命令,在家可以用,在公司的PC里面却不能用。因为家里是bash,公司是csh


3. prompt变量 set prompt = "[%n@ $color_green %c $color_white]%#"
    
   (1)  注意 " "和''区别 .
   (2)  %n 登录名
   (3)  $color_green : 表示从此之后,颜色变为绿色。
   (4)  %c 当前工作目录的最后部分
   (5)  $color_white : 颜色回到 白色
   (6)  %# $符号
   
   这样显示出来的 提示符   [caokang @ case_adc]$   其中case_adc是绿色字体。
   
  以上是一个例子,我们还可以自由的设计其他 提示符.
  
  通过该章节,我们最应该了解的 知识点2 .不同shell的参数是不一样的。


<15章 软件包的管理>
1. 回顾在windows下面安装选件过程:
   从某一个网站(360软件中心)下载 qq2015.exe文件。然后双击,选择安装路径-->选择安装选项--->安装过程---> 安装完成,生成快捷方式。
   或者从同学那边拷贝一个软件到本地、然后安装。
   那么,在Linux下面,连基本软件怎么安装都很困惑。软件去哪里下载都不知道。


2. linux系统,获取软件的途径也有两个。
    (1) 通过内置的 类似于(软件中心、应用市场)的东西,基本的软件都可以在这里面。 
    (2) 从非知识产权保护的软件下载一个软件。
    (3) 到底该怎么样安装呢?? 


3. 众所周知,linux阵营分成两派,redhat系列和 debian系列。redhat的软件包以 “xxx.rpm”   debian的软件包以“xxx.deb”
   下面以 redhat系统为例。
   
4. 依赖性: 在linux下面,因为软件碎片化、每个软件都会牵连。 比如安装程序a的前提是 必须已经安装了 b和c .而安装b之前必须要
           安装d. 这就是 软件包的依赖性。
   
5. 通过 资源库(软件中心)安装一个程序:   yum -install packagexxx
   它会完成以下: (1) 下载、(2)环境分析 (3)自动修补依赖性 (4) 安装        
   yum是一个懒人模式、它会自动的下载、修补依赖性并安装。
   
   yum 语法:   yum  [OPTION] COMMADN
       其中[OPTION]有 -h -t 之类的。可有可无
       CMOMAND选项: install
              erase 
                  search
                  update
          info
                 。。。    从-help上看,yum指令的COMMAND,制定了特定的操作,如 安装\卸载\查找\升级    
   
    
6. 通过 本地copy 安装一个 rpm。 使用   rpm -i packagexxxx。这个仅仅是安装程序包,当遇到依赖性问题时,安装失败,报错
    
   rpm [option ...] 
        -i 安装
        -e 卸载
        -U 升级
        -t 测试(不安装,只测试其环境)
        
  
7. 在redhat里面是 yum和rpm的天下,在debian里面是 apt-get 和dpkg命令 



<18 查找文件>


1. locate 只能根据


2. find [path...] [experation]
   默认 path是当前路径、 experation是 printf
   
           
   是不是这样理解:  find  path...   [test & operators ]  [action]        
             查找path路径、满足 test条件时,执行action。  
                           
   (1) path路径可以是绝对路径或者相对路径。 path1 [path21]  它会把path1以及其下的所有子目录都翻一遍
   
   (2) 条件test可是五花八门:  比如按名字、大小、时间、文件类型、权限、归属等。
             | -name pattern    pattern 可以直接就是 文件名,或者使用 "正则"
             | -iname patern    不区分大小写
             | -user username  或者 -group gname  根据文件归属查找
             | -perm 754  wrx w-x w-- :相当于找到是这个权限的。
             | -perm +111 user可执行或者group可执行、或者other可执行,只要这三个条件满足一个就可以了。
             | -perm -121 必须满足 user可执行 & group可写 & other可执行 ,必须满足这三个条件。
             | -type f(普通文件) d(目录) l(链接)...
             | -size +1k(大于1k) -5k(小于5k)        (注意 下面所有带参数,都是+代表大于,-代表小于)
             | -cmin -5 :在5分钟之内,修改的 属性或者内容的。  
             | -mtime -1 : 在一天之内,仅内容修改过。
             | -anewer file: 比文件file之前访问的。   
             | 上面三个, a代表访问、m代表 仅内容修改过、c代表任何变动。 min代表分钟、time代表一天  一般c用的较多。 
              
    (3)为了更好的组合 条件,引入了 operators,用于 组合test。
             -and  把and 前后两个条件 &起来 
             -or   or前后两个条件 |起来
             -not  非 后面的条件。 比如 -not -type f :非普通文件
             -()   可以使用(),构造优先级。  但是需要注意转义符 \( expr1 -and expr2   \) -or (-not expr3) 
    
    (4) action : 该项默认是 -print 即输出到标准输出。
                 同时还有其他常用的几个选项:
                 
              |-ls     列出
              |-delete 删除
              |-exec rm "{}" ";" :相当于对test判断的结果执行 rm操作。  注意 "{}" ";"是尾缀,代表命令rm的 对象和 结束。  
              |-ok rm "{}" ";"   :跟exec一样,只是每次都会询问user 是否要rm。 
              |-ok rm "{}" +     :跟上面类似,但是 这个相当于 先把test结果都找到,编程一个list表 +,然后做为rm的对象
              |find -name "*.v" | xargs ls -l :相当于把 find结果,管道传给 xargs,然后 xrags用于 ls的对象 即 ls -l argus


3. 借上面的内容,在此处讲下 shell命令行里面的 通配符\元字符和转义符.

     通配符: 通常出现在  命令的参数中, 更多的是作为 操作对象.

              “*”(>=0个字符) 、 " ? "(1个字符)、[ab] a或者b 、 [!ab]非a且非b 、

            {str1 str2} 字符串1 或者字符串2、 [c1-c2] c1到c2

            通配符与 正则表达式是不一样的,他们是shell简便的表达. (按照道理来说,正则表达式应该是 从它演变过去的)

            在命令参数中, 遇到这写字符,对应的shell命令的c++会解析他们并匹配 还原"参数".  然后才 执行命令.

    元字符: 这是一群特殊 函数功能的 字符。 比如 & (后台运行)、 |(管道输出)、$(参数置换)、>(输出重定向) 等。

               他们使用了一些 特殊的字符,就是为了特殊化,以起到视觉效果。

    转义符: 当越来越多的字符,被赋予了特殊意义,为了能 正常普普通通的使用这些字符,设计了转义符。

                单引号  '  ' : 内部字符全部作为普通字母。

                双引号" " :双引号内部,只存在变量置换$  ` 命令引用等少见的几个符号还有特殊意思。 其余都变成普通字符

               反斜杠 \  : 反斜杠,只把其后的一个字符变为 普通字符。


工作原理:  如果shell 命令行中碰到转义符,会根据 双引号、单引号、反斜杠执行不同的 替换功能。然后再运行程序。 



<第十九章  归档和备份>

 我们从别的地方下载下来的东西,很多都是  .tar .tgz. .gz格式。傻傻分不清楚。 我们也了解这是 压缩格式,但是怎么解压缩?

 还跟windows一样双击? 本章节就讲述这些操作。


1.  gzip:   我们知道windows下面的压缩包一般是zip格式的。那么容易记忆 gzip就是压缩的命令。

                 常用 gzip aaa.v  : 压缩文件,原文件消失,压缩文件名不必定义,就是aaa.gz  

                          gzip -c aaa.v > haha.gz  : 压缩文件,同时保留原文件、并压缩文件称haha.gz      (用 -c 一定要制定 压缩文件名)


                     -r 为递归压缩,用于含路径的压缩。  递归压缩,不是把他们合成在一起压缩,而是每一层每一个文件单独压缩.  知识相当于 批量压缩操


2. gunzip : 与压缩命令相反,用于解压缩。 -c 保留原.gz文件。

                   -r : 递归 是逐个解压缩。


还有其他的压缩命令: bzip2 bunzip2 


3. 关于 tar的用法 ,在公司的文档中.后面希望补充进来.

   我们知道 批量递归压缩,是把每个文件都压缩。其实不太符合我们想要的。
    最好是把所有文档,归结成一个 文件。然后再对这个文件进行压缩。 下面讲的tar就是 归档命令。
    
    tar 主选项  [副选项...] tar名 + file/dir
         | c  创建tar包
         | x  解包
         | t  查看包内容(并不解包)
         | u  更新包内文件
         | r  追加新内容    
                  | p 保留原属性
                  | v 可视化
                  | f 制定 tar包名称。(必须放在最后,并紧跟 tar包name 最好以 .tar结尾
                  | z 对tar包进行 gzip压缩。(注意此时,f参数 仍在最后,tar_name 最好带有后缀 tar.gz
                  | j 和z一样,不过压缩成bzip2格式    
                  
 (3)  如果后面的file,是使用相对路径描述的。那么压缩目录也就只到该目录
   若使用绝对路径,那么压缩目录 就从根目录起。
   
   
 (4)  zip 和unzip :我们知道在windows下面,zip为主要压缩格式,为了和linux更加方便共享。linux下也有zip压缩命令。
                    常用 zip -r xxx.zip file/dir                  
                        unzip   xxx.zip
                    这个命令主要就是跟 windows打交道。 在linux下,打包压缩,主要还是 tar czvf 



                  
<第二十章  正则表达式> 


1. 正则表达式,是为了方便的描述的东西。 
   
2. grep 函数: 全程 global search  regular expression and print out
              即 匹配rep,并打印出来。 本质上就是 匹配"正则表达式"。
              grep [OPTION]... PATTERN [FILE]....
              
              整个grep C++函数工作原理: 1. shell命令行 先分析参数列表。完成必要的 通配\转义\元字符转换。
                                        2. C++ 分析整个 PATTERN. 翻译出它想要表达的意思。
                                        3. 对FIle文件逐行的进行匹配。
                                        4. 输出结果。
             为了避免 shell命令行 在第二步骤中,先把特殊字符置换。提倡对PATTERN使用单引号。’PATTERN‘
             
             
3.[OPTION]选项中,有针对rep的,有针对输出选项的。 
   
   rep选项:
            -i : 正则表达式忽略大小写 
            -f Filex :表示这个 PATTERN 来自于文件Filex.(如果是多行的,会一行一行的匹配)
            -v :翻转,专门找不匹配的
            -w : PATTERN做为一个单词项 匹配
            -E :如下文第5条目。整个正则表达式是 扩展型正则表达式
            
   
   输出现象: -A NUM  打印匹配行 以及该行之后的 NUM行。比如: -A 1 .就打印出 匹配行和下一行
             -B NUM  与上面类似,是Before 行
             -- color 颜色标注。
             -c      只输出匹配行的数目。 (此时,--color -A 1 之类的参数就会自动失效了)
             -n      输出时,顺便附带上 其行号
             -o      默认输出是一行内容,-o表示只输出匹配值。(此时 -A 1 失效)
             -h      hide 隐藏 输出的前缀 文件名。
             -l      只输出 匹配项所在的 文件名
             -L      只输出 不匹配项 的文件名
             
4. 正则表达式 PATTERN
   特殊符号 ^ $ [] - * . ? + {} | () \  以及字母和阿拉伯数字。 
   通过赋予 特殊符号 特定的意义,配合上正常字符,来表达抽象难以用程序语言表达的东西。
     
     “.”    : 代表任意一个字符。可以看出他有两层含义,第一是任意字符,第二是 它的数量是 1个字符。
     “^”    : 锚定符,^it 的真正语法是: 以i开始,并紧跟t,等价于以 it开始的行
     “$”    :锚定符,is$ 的真正语法是:  以s结尾,s前必须是i。等价于 以is结尾。
     “|”    :在正则表达式内,表示 或的关系。用于多个匹配项的连接
     “[ab]” :任意一个字符,均可。 比如 i[ts]就能匹配 it或者is
     “[^ab]”:非a非b的字符。 比如i[ts] 无法匹配it或者is,但能匹配 in io之类的
     “[a-z]”:如果让输入abcdefg....xyz会十分麻烦。简便的增加了一个"-"符号。就能节省很多 
              默认情况下 a-z 代表着abcdef...xyz.但也有unix系统内 a-z表示aAbBcC...xXyYzZ.一般由系统语言参数决定。 
              一般推荐直接改掉系统参数。
      POSIX还制定了一个折中的表达方法: 用第三种描述方法:
             [:alnum:] 字母和数字集合、相当于a-zA-Z0-9。 (应当理解为何多加入了:,否则[alnum]就是一个rep了)
             [:alpha:] 纯字母集合 A-Za-z
             [:digit:] 纯数字集合 0-9
             [:upper:] 大写字母集合 ,
             [:lower:] 小写字母集合.
             [:xdigit:]十六进制数集合 0-9A-Fa-f
             [:space:] 空格
      特别注意的是,[:alpha:]只是表明一个字符集合。
      [:alpha:] = a-zA-z. 必须要[[:alnum:]]使用表示一个纯字母。
      或者[ [:alpha:][:digit:]] 这相当于[[a-zA-z][0-9]]
      


      
      下面进入量词阶段。(都是形容前面一项 出现的次数)
      “*”   :表示 0-无穷个字符。
      “?”  :表示 0-1个
      “+”   :表示1-无穷个字符
      {m,n} : 至少出现m次,但不多于n次
             {,n} 不多于n次
             {m,} 至少m次
             {m}  恰好m次
          
                                   
5. 基本正则表达式和扩展性正则表达式的区别
   
   这两个表达式的区别主要在于 部分字符的定义上。两者共同支持: ^ $ . [] *  
   对于其他的符号来说:
   基本正则表达式  () {} | ? + 本省是普普通通的符号。             想使用特殊意义,需要加\.
   扩展正则表达式  () {} | ? + 就是特殊符号,本身就带有特殊意义。 想普普通通用,需要加\。  

 



<第二十一章   文本处理>

借用一句似懂非懂的话,linux万物皆文本。

那么怎么处理文本,将会变得十分重要.  其实在ic设计中,碰到所有问题也基本是文件。如verilog.v   log 报告。工具启动文件。testcase.v等等

那么一般都对文本做什么操作?

针对一个文本来言,   ①修改文本:  插入、删减、替换、重新布局、

          ②提取信息: 寻找关键信息、统计文本。

针对若干文本来言: ①逐个文本进行以上处理。

 ②文本之间的 连接、比较之类的操作。


1. cat命令.   拼接文件并标准输出。

          cat [OPTION]   [FILE]...     把 file1 ...filen 拼接在一起,并输出出来。 [OPTION]一般是关于输出项的 选项。  

凡是带有 file项的。如果不加任意选项或者为-,代表 从键盘输入,并且键盘输入要以ctrl+d结束。

凡是能标准输出的东西, 如果加上 输出重定向,就能改变输出目的地。

所以 cat > test.txt      cat - > test.txt.  就相当于 新建一个文本(冲刷掉原来的内容)。


[OPTION]     -A :  显示所有字符,包括 Table^I 和换行符$。 (cat 文件,看换行,就能区分 dos文件和unix文件)

                              -n   :   显示行号

                              -s   : 压缩显示空白行。(连续多个空白行,只显示一个)


cat -n test.txt > file.txt 相当于 对test加 行号操作;   cat -s test.txt > file.txt 操作就相当于 压缩空白行的操作。



2. sort  [OPTION] ... [FILE] ...   命令功能: 以行为单位,把文件排序结果输出到 标准输出(屏幕)。

             | -b  默认情况下,sort以行为单位, 从第一个字符开始。空格也算是字符。 当想从第一个非空格符开始排序,需要加上-b 

             | -n 按照数字大小比较

             | -r  反向排序

             | -f  忽视大小写

             | - k 5 从pos5 开始进行排序

             | -t     指定某个字符为Pos的分割符号  (默认是table和空格)

             | -o   file 指定输出位置

             | -u  unique ,即排序中遇到完全一样的行,就丢掉一个。


上面的很多参数都比较常见、重点讨论下 -k选项

-k 2        :表示从 POS2 排序,直到结尾

-k 2nr     : 表示从 POS2 --尾按照-nr排序,POS1再按照ascii排             (重排是针对于 POS2 -nr一样的行)

-k  2,2 : 表示从POS2开始排序,结束到2. 然后在从POS1 排。

-k   2,2nr  : 表示对 POS2按照 -nr参数排序,完事后从POS1、POS3...按照ascii排序

-k   2,2nr  -k 3r  :表示对POS2 按照-nr排序,对POS3---尾按照-r排序。POS1按照ascii排


-k  2.1,2.5: 表示从POS2的第一个字符到第5个字符进行ascii排序。



3. cut   - remove sections from each line of files  意思很明确,是从files 的每一行中,删掉某些 文本段,并输出至标准输出。

那么怎么判断 需要该删除什么内容呢?   

        cut  [OPTION] ... [FLIE]...

                  | -c   N    :   cut输出每行的第N个字符; 

                          N-M    输出第N至M个字符

                         -N  前N个字符、 M- 代表 第M个至结尾。(这个也是经常用的,因为每行的 字符数目是不一样的)

                  | -d ‘:’ 指定冒号是分隔符.  POS1:POS2:.... POSn         

                  | -f  指定POS值。

                  | -complement  相当于取反输出。输出哪些非cut字符

          一般而言,-d -f 是一起用;-c 单独使用。  并且默认 分隔符号是 Table键,不是空格键。 所以在使用空格键为分隔时,需要特别的 定义 -d ' ' 


这个cut命令 主要是为了从 某一个文件中得到 某一POS位置的字符.并输出重定向保存下来, 以备后用


1. paste 命令  把文件1和文件2 每行,连接在一起。中间使用 分隔符
              paste [OPTION]... [File]...
                       | -d ':' 定义分隔符               
                       | -s     把file1的每一行,用 分隔符连接在一起。
                                然后第2行,把file2文件的每一行,也用分隔符连接。


如 file1   file2       paste -d ':' file1 file2          paste -d ':' -s file1 file2
   1       a            1:a                                                1:2:3  (file1 的每一行)
   2       b            2:b                                                 a:b    (file2 的每一行)
   3                     3:                   
                  


2. join命令 两个文件中,同一行中,是否有一样的 文本段?
            join [-1 POSm -2 POSn] [-a 1 -a 2]            [-i] [ -t ':’]  file1 file2
                    [-j POSx        ]            [-v 1 -v 2]          
                                                       [-o 1.1,2.1,2.3]
            首先[-i] -t':'   , -i 是文本段 比较忽略大小写。 -t':'是指文件中的 文本段的分隔符号
             -1 POSm -2 POSn : 用于指定  比较flie1每行的 POSm 是否和file2每行的POSn 
             -a 1            : 当有的行 POSm 不等于 POSn时,打印出file1的行
             -a 2            :跟 -a 1一样,不过是 打印出file2的行
             -v 1            :专门打印出 不匹配行的 file1行
             -v 2            : 专门打印出 不匹配行的 file2行
             -o 1.1          : 专门定义打印的内容
             
    这个命令用于处理 两个文件直接的 链接。尤其是有公共文本段的。
            
            
3. comm [OPTION]   file1 file2
特别注意: file1 和file2 是 排序后的文件。   (--nocheck -order可以不管排序与否)     
用这个命令去比较 文档,还是不太好用



4. diff命令   其结果所解释的是:  如何把file1 转换成file2。
 一般而言,能使用 beyond compare的情况,尽量使用。因为可视化十分的清晰明了。
 
 diff原理,是按照经典动态规划的方法,找到文件file1和file2的对比方法。最简单的得出两者的异同。
 
 此处我们不追求原理,只分析其 四种输出状态:  -normal -c -u -y


file1    file2                            直接使用 diff file1 file2                                           
 a         d                              1,2d0             //删除file1的 1,2行                              
 c         a                                d         a                                f         g                              4c23              //修改file1 的第四行,修改file2的第2、3行。       
 g         h                                          e                              ---                                                                 
 h                                        >a                //file2的第2行内容                                
                                          >a                //file2的第3行内容                                
                                          6d4               //删除file1的第六行                               
                                          <                 //file第六行的内容,即空白行                      
                                          7a6               //在file1的第七行之后,新增内容,来自file2的第六行
                                          >e                //新增的内容是e                                   




如果使用 diff -c file1 file2                                         如果使用 diff -u file1 file2            
*** file1   2017-04-25 13:43:20...                                   --- file1   2017-04-25 13:43:20...       
--- file2   2017-04-25 13:44:20...                                   +++ file2   2017-04-25 13:44:20...    
***************                                                      @@ -1,7 +1,6 @@                       
*** 1,7 ***                                                                         -a                                    
-a                                                                                      -c                                    
-c                                                                                        d                                    
 d                                                                                      -f                                    
!f                                                                                      +a                                    
 g                                                                                    +a                                    
-                                                                                         g                                    
 h                                                                                     -h                                    
--- 1,6 ---                                                                        +e                                    
 d
!a                                                                    以上是解释的是从file1,如何变化成file2的步骤。此时
!a                                                                    没有把c转换成+-,先删后增
 g
 h
+e 


上半部分是file1的内容,前缀-代表删除,!代表需修改;
下半部分是file2的内容,前缀+代表file需增加,!代表file1需改成的目标 
 


如果是直接使用 diff -y file1 file2 
a             <
c             <
d              d
f             |a
              >a
g              g
              <
h              h 
              >e
它直接把 file1 和file2列表出来  -W 200 可以定义 间隔
用特殊符号表明了两个文件的区别。


当然我们推荐还是使用beyond compare 去比较文件。              


5. patch 命令暂时不管。他使用diff生成的补丁,然后打补丁给file1,使得file1编程file2。


6. tr命令
    tr [OPTION]... SET1 [SET2]
         | 空  把 SET2中,出现的SET1字符,一一对应的替换掉。
               适用于字符集 之间的一一转换。如大小写转换
         |-d   tr -d 'abc' file2  删掉file2中,SET1中出现过的字符
         |-s   tr -d 'abc' file2  压缩重复出现的 字符a 、b、c  如aaaaaabbbdefccc ---> abdefc          
                                  用于压缩空格十分有效



7. sed命令
 sed+[OPTION]+编辑指令+文件
               |-对象
               |-指令
                   |- 缩写
                   |- 参数列表


相当于 对文件执行编辑指令;同时呢sed会逐行的进行 编辑,具体的编辑有 替换、剪切、复制等操作。
 因此,编辑指令中,指定对象;需要先是否要逐行? 还是说符合条件的行?
      参数列表制定 对象的对象: 即要替换字符,用什么字符替换之类的。
      
[OPTION]选项,一般用于控制输出:
   | -n : 不用打印 pattern_space的内容,见下面的 sed工作机制
   | -i :直接更改原文件



 sed 适用于对文件的批量处理。有两个参数: (1)该行要不要批量操作?(2) 具体的操作细节。


 语法如下:
 sed  [参数]... file       
       |-- 行对象指定
       |-- 操作细节
       |-- argument


  行对象指定: (1) 十进制数字:  5 :就代表对该文件的第5行进行操作。其余不操作
              (2) /regular expression/ :用"//" 双斜杠 括起来的。匹配上该正则表达式的行进行操作。
              (3) $表示最后一行
              (4) 1~2:表示 1.3.5.7行为制定行
              (5) 1,+2: 表示 1,2,3行
              (6) 1\! 除了第一行外,都匹配
              (3) 10d 代表仅对第10行操作
                  /apple/对含有apple的行进行操作
                  10,/apple/ 代表从第10行开始,直到含/apple/行 结束。
                  即 address1[,address2] :无地址:对全部行
                单地址: 仅对该行
                                           双地址: 从addr1开始到addr2结束
                                           
  操作细节: 前面的行对象制定好之后,具体要对这一行,做什么样的操作? 删除增加某个字符?改变位置?
            这个就是 "操作细节"所要描述的。
            
     |--- 缩写
     |--- 具体参数      
     
     我们知道,删除、增加、搬移命令,所需要的 参数信息不尽相同。下面大致介绍常用的操作命令:
     
     
  "s" : s/pattern/replacement/  使用replacement替换字符pattern 
          很显然 pattern是regex, 一开始不熟悉的情况下,用精准匹配就行
          进一步思考: 
                   (1) 如果想用 enjoy my_holiday 替换 my_holiday.
                       我们当然可以 s/my_holiday/enjoy my_holiday/   我们可以使用 & 替代 my_holiday.
                       简化下来就是: s/my_holiday/enjoy &/ 
                   (2) 如果 enjoy your_holiday ,Tom and james. 换成 Tom and james,enjoy your_holiday
                       s/\(enjoy your_holiday\)\(,\)\(Tom and james\)/\3\2\1/ 
                       其实还是利用 正则表达式规则: \(...\) 可以用 \n替代  
                     
  "d" :只一个d  代表 删除行。
        即删除 "行对象指定 的行" 
        
  "a" : a 就是append   Address1 a "----\n-----" pet.txt
        
        在Address1下面一行,添加 两行---- 
        注意 a前面只能跟一个地址参数。 里面如果添加多行,需要\n 
        
  "i" :i就是insert,跟a语法一样,只不过它是在 Address1前一行插入。
              
  "c" : change. 语法: Addr1 [,Addr2] c “-------” 
        相当于把 Addr1行到Addr2行,每一行的内容,都替换成------
        
  "p" : addr1 [,addr2] p 额外打印出 指定行的内容
  
  "w" : addr1 [,addr2] w file  相当于把 指定的行的内容,存入到file中。
  
  "r" : addr r file :相当于 在匹配addr后,把 file内容逐行读出来输出。                               
                   
  "y" : addr1 [,addr2]  y/abc/ABC
        对于 制定行,将其中行内容中所有的 a->A b->B c->C
        不支持 字符区表示
  
 
  "n" : 见下文
  
  "N" :  见下文
       
        
  整个sed命令的 工作机制:
    
    foreach line {
       pattern_space <= line[i];  //把每行读入 pattern_space
       
       if(pattern_space match )  //指定行
       {
          pattern_space <= function{d/a/c/s...,pattern_space} //对Pattern_space执行 cmd,然后写会pattern_space
       }
       
       i++;       //行指针增加1
       
       if -n not exit {
          print  pattern_space;    //-n参数 是输出控制参数。 默认把每个pattern_space 打印至标准输出
       }
     }
        
其中 function 里面是 "n"时,它的函数功能是  pattern_space <= line[i+1] i=i+1;
                                            即把下一行写入pattern_space内,指针加1.
                                            然后再i++,
当 function 里面是"N"时,它的函数功能是  pattern_space <= "pattern_space + line[i+1]" i=i+1;
                                            即 把源pattern_space和 下一行内容,当作一个整体。写入pattern_space. 指针加1
                                            然后再i++,
          
  "q"  : 退出sed
  
  "#"  :添加注释 
  
  "h"  : 把此时的 pattern_space内部的内容,覆盖写入 hold_space内
  "H"  : 把此时的 pattern_space内部的内容,additon写到 原hold_space后面          
                                                     
  "g"  : 把hold_space内容,覆盖写到pattern_space内
  "G"  : 把hold_space内容,addition写到 原pattern_space后面
  "x"  : 互换 hold_space和pattern_space内容
                                           


----arugemnet
  "g"  : 比如 sed '1,5s/caokang/mokang/g   :表示从第一行到第五行,每一行的每一个 caokang,都替换成mokang
  "2"  : 比如 sed '1,5s/caokang/mokang/g   :表示从第一行到第五行,每一行的 第2个 cokang,替换成mokang
  "2g" : 比如 sed '1,5s/caokang/mokang/g   :表示从第一行到第五行,从第2个 cokang,开始,均替换成mokang
  ""   : 比如 sed '1,5s/caokang/mokang/g   :表示从第一行到第五行,只替换第一个cokang
  "p"  : 比如 sed '1,5s/caokang/mokang/g   :表示从第一行到第五行,替换第一个cokang后,
                                            不再继续替换,把替换一个caokang后的该行额外输出在 标准输出
"w file"  : 比如 sed '1,5s/caokang/mokang/g   :表示从第一行到第五行,替换第一个cokang后, 
                                               不再继续替换,把替换一个caokang后的 行内容,写入 file里面。


比较常用的是 "ng"用于指定 替换项






目前,我们如果在命令行中,书写sed -i ‘s/caokang/mokang/g' test.txt
我们一般为了可读性,只会 写一个命令s。
我们可以把 一连串的 命令,写在一个script里面,然后 sed -f script test.txt  



<第二十二章  格式化输出>

1. fold命令
      fold -w 50     输出显示,位宽是50字符。
      fold -w 50 -s  位宽50字符的同时考虑 word的边界


2. pr : 将较大的文件分割成多个页面,适合于打印


3 echo 命令

   echo [-ne] 字符串

根据shell 工作原理.  shell命令行自己先提前把 字符串做一遍 元字符扩展.  所以 字符串里面有特殊意义字符时,需要用""或者‘’保护起来 

-n   不要在最后自动换行.(echo命令,会自动的在最后 打印出一个 换行符号)

-e   开启反斜杠\的转义功能。   我们知道  字符串会被shell预先 元字符扩展。

       当字符串不加引号时,反斜杠会提前被 释义。如果加了双引号保护,那么shell元字符扩展之后,里面还有反斜杠\、这个时候 使用-e就能启用 echo 命令      \的转义功能

转义如下:     \a :嘟一声

                            \\ : 反斜杠

                            \b :删除前一个字符

                            \t  :  table字符

                           \n  :换行,光标到行首

                           \f :换行,光标直接下移(不从头开始)     如echo -e "aaa\fbbb"

                                                                                              aaa

                                                                                                      bbb



4. printf命令.

             printf  format-string  [arguement]   

printf命令工作机制也是   shell命令行先预先 元字符扩展。 同时由于 printf命令 不会自动的换行,所以  format 里需要定义换行符\n。

为了防止shell 命令行提前 释义,所以 format-string一般都用双引号 括起来。

            只有当 "format-string"里面存在 %s %d这类表达式时,arguement才必须存在。

       printf里面常用的 反斜杠转义,依旧存在.  于此同时,还有% 定义的特殊格式.


    %s 字符串                               

    %.ns 打印字符串前n个字符。   printf "%.3s" sdfer  --->  sdf

    %-10s  打印10个字节,左对齐

    %d 十进制整数

    %.5d :十进制数,前面补0     printf "%.3d" 12  --->   012

     %f  浮点数

     printf " i am is %s, my age is %d. my high is %.2f “  caokang 25 182.21 



                   









    



你可能感兴趣的:(linux)