LINUX学习笔记——Shell与正则表达式


Shell

变量的使用与设置

  1. 读取变量内容:

    echo $变量 或 echo ${变量}

  2. 设置规则:

    • 变量与内容直接用=连接,两边不留空格;
    • 双引号内特殊字符保留功能;
    • 单引号内为一般字符;
    • [\]转义符+特殊符号(空格,$等)将其变为一般字符;
    • unset+变量名 取消变量设置;
    • export 变量 将变量变为环境变量以在子进程运行。
  3. 例:实现快速ssh连接服务器

    Tencent = "root@42.142.130.**"

    ssh $Tencent

环境变量的功能

  1. env命令查看默认环境变量与常见环境变量说明;
  2. set命令查看所有环境变量:

    • $: 本次shell的pid -> echo $$ ;
    • ?: 上次命令返回值。
  3. locate命令查看语系;
  4. read, arry, declare:

    • read [-p] var [-t],使用-p后添加输入提示,-t后添加秒数;
    • declare[-aixr] var,声明变量,aixr对应数组-整型-环境变量-const只读;
    • var[num]="content",数组名+[数字]获得一维数组。

变量内容的删除、取代与替换 (Optional)

  1. ${variable#/*local/bin:}: #代表『从变量内容的最前面开始向右删除』,且仅删除最短的那个;
  2. echo ${path##/*:}:##变成『从前面删除掉最长的那个数据』;
  3. echo ${path%:*bin}: % 符号代表由『最后面开始向前删除』;
  4. echo ${path%%:*bin}: %% 代表的则是『从后删除最长的符合字符串』。

命令别名与历史命令

  1. 命令别名设定: alias, unalias:

    alias lm='ls -al | more'

  2. 历史命令: history

    • 列出目前内存内的所有 history 记忆

      history

    • 列出目前最近的 3 笔资料

      history 3

    • 立刻将目前的资料写入 histfile 当中

      history -w

Bash Shell 的操作环境

  1. bash 的进站与欢迎讯息: /etc/issue, /etc/motd

    • /etc/issue: cat查阅,根据issue内的各代码意义可更改开屏显示的系统信息(Manjaro Linux实操发现为只读文件,chmod修改权限后改动);
    • /etc/motd: 自定义主机启动后显示的讯息。
  2. bash 的环境配置文件

    • login shell:取得 bash 时需要完整的登入流程的,就称为 login shell。举例来说,要由 tty1 ~ tty6 登入,需要输入用户的账号与密码,此时取得的 bash 就称为『 login shell 』;
    • non-login shell: 取得 bash 接口的方法不需要重复登入的举动,举例来说

      • 以 X window 登入 Linux 后,再以 X 的图形化接口启动终端机,此时那个终端接口并没有需要再次的输入账号与密码,那个 bash 的环境就称为 non-login shell 了.
      • 在原本的 bash 环境下再次下达 bash 这个指令,同样的也没有输入账号密码, 那第二个 bash (子程序) 也是 non-login shell.
    • /etc/profile (login shell 才会读)
    • ~/.bash_profile (login shell 才会读)
    • ......
  3. 终端机的环境设定: stty, set

    • stty [-a] 列出所有的按键与按键内容 (出现 ^ 表示 [Ctrl] 按键);
    • 通配符与特殊符号*, ?, [] 等等,『档名』尽量不要使用到这些字符。
    符号意义
    *代表『 0 个到无穷多个』任意字符
    ?代表『一定有一个』任意字符
    [ ]同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符, 可能是 a, b, c, d 这四个任何一个』
    [ - ]若有减号在中括号内时,代表『在编码顺序内的所有字符』。例如 [0-9] 代表 0 到 9 之间的所有数字, 因为数字的语系编码是连续的!
  1. 数据流重导向

    • 概念:

      • 指令可能会由文件读入资料,经过处理之后,再将数据输出到屏幕上,可能分为standard output 与 standard error output ,二者分别代表『标准输出 (STDOUT)』与『标准错误输出 (STDERR)』;
      • 例子:
        系统默认有 /etc/crontab 但却无/etc/vbirdsay, 此时若下达『 cat /etc/crontab /etc/vbirdsay 』这个指令时, cat 会进行:

        • 标准输出:『指令执行所回传的正确的讯息』,读取 /etc/crontab 后,将该文件内容显示到屏幕上;
        • 标准错误输出:『 指令执行失败后,所回传的错误讯息』,因为无法找到 /etc/vbirdsay,因此在屏幕上显示错误讯息。
      • 问题与解决方式 : 正确或错误的数据都默认输出到屏幕上,导致较为混乱,那能否透过某些机制将这两股数据分开呢?即数据流重导向的功能。
    • 功能及实现 : 数据流重导向可以将 standard output(简称 stdout) 与 standard error output (简称 stderr) 分别传送到其他的文件或装置去,而分别传送所用的特殊字符则如下所示:

      • 标准输入 (stdin) :代码为 0 ,使用 < 或 <<;
      • 标准输出 (stdout):代码为 1 ,使用 > 或 >>;
      • 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>>;
    • 例一:

      ll /

      ll / > ~/rootfile <==屏幕并无任何信息

      ll ~/rootfile <==有个新档被建立了

      屏幕没有数据,原本『 ll / 』所显示的数据已经被重新导向到 ~/rootfile文件中

    • 输出文件建立规则:

      • 1> :以覆盖的方法将『正确的数据』输出到指定的文件或装置上;
      • 1>>:以累加的方法将『正确的数据』输出到指定的文件或装置上;
      • 2> :以覆盖的方法将『错误的数据』输出到指定的文件或装置上;
      • 2>>:以累加的方法将『错误的数据』输出到指定的文件或装置上;
    • 例二:

      find /home -name .bashrc <==身份是 dmtsai !

      find: '/home/arod': Permission denied <== Standard error output

      find: '/home/alex': Permission denied <== Standard error output

      /home/dmtsai/.bashrc <== Standard output

      假如要将数据输出到 list 这个文件中,执行『 find /home-name .bashrc > list 』会发现 list 里面存了『正确』的输出数据,屏幕上还是会有错误的讯息出现

      ->find /home -name .bashrc > list_right 2> list_error

      实现两数据分开传送

    • 命令行执行的判断依据: ; , &&, ||

      • cmd ; cmd (不考虑指令相关性的连续指令下达)
      • cmd1 && cmd2

        1. 若 cmd1 执行完毕且正确执行($?=0),则开始执行 cmd2;
        2. 若 cmd1 执行完毕且为错误 ($?≠0),则 cmd2 不执行。
      • cmd1 || cmd2

        1. 若 cmd1 执行完毕且正确执行($?=0),则 cmd2 不执行;
        2. 若 cmd1 执行完毕且为错误 ($?≠0),则开始执行 cmd2。
  2. 管线命令 (pipe)

    • 概念:

      ls -al /etc | less使用 ls 指令输出后的内容被 less 读取,并利用 less 的功能前后翻动相关的信息 ,管线命令『 | 』仅能处理经由前面一个指令传来的正确信息,也就是 standard output 的信息 。

    • 撷取命令: cut, grep :撷取讯息通常是针对『一行一行』来分析的

      • cut

        cut -d'分隔字符' -f fields

        cut -c 字符区间

        选项与参数:

        -d :后面接分隔字符。与 -f 一起使用;

        -f :依据 -d 的分隔字符将一段讯息分区成为数段,用 -f 取出第几段的意思;

        -c :以字符 (characters) 的单位取出固定字符区间。

      • grep

        grep [-acinv] [--color=auto] '搜寻字符串' filename

        选项与参数

        -a : 将 binary 文件以 text 文件的方式搜寻数据 ;

        -c : 计算找到 '搜寻字符串' 的次数 ;

        -i :忽略大小写的不同,所以大小写视为相同;

        -n : 顺便输出行号 ;

        -v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行 ;

        -color=auto :可以将找到的关键词部分加上颜色的显示。

    • 排序命令: sort, wc, uniq

      • sort: 可以依据不同的数据型态来排序

        sort [-fbMnrtuk] [file or stdin]

        选项与参数:

        -f :忽略大小写的差异,例如 A 与 a 视为编码相同;

        -b :忽略最前面的空格符部分;

        -M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;

        -n :使用『纯数字』 进行排序(默认是以文字型态来排序的);

        -r :反向排序;

        -u :就是 uniq ,相同的数据中, 仅出现一行代表;

        -t :分隔符, 预设是用 [tab] 键来分隔;

        -k :以区间 (field) 来进行排序。

      • uniq: 将重复的资料仅列出一个显示

        uniq [-ic]

        选项与参数:

        -i :忽略大小写字符的不同;

        -c :进行计数。

      • wc: 算输出的讯息的整体数据

        wc [-lwm]

        选项与参数:

        -l : 仅列出行;

        -w : 仅列出多少字(英文单字);

        -m :多少字符。

        • 双向重导向: tee :同时将数据流分送到文件去与屏幕 (screen)

        tee [-a] file

        -a :以累加 (append) 的方式, 将数据加入 file 当中
    • 字符转换命令: tr, col, join, paste, expand
    • 分区命令: split
    • 参数代换: xargs

      ......

正则表达式

基础正则表达式

  1. 语系对正则表达式的影响

    特殊符号代表意义
    [:alnum:]代表英文大小写字符及数字,亦即 0-9, A-Z, a-z
    [:alpha:]代表任何英文大小写字符,亦即 A-Z, a-z
    [:blank:]代表空格键与 [Tab] 按键两者
    [:cntrl:]代表键盘上面的控制按键,亦即包括 CR, LF, Tab, Del.. 等等
    [:digit:]代表数字而已,亦即 0-9
    [:graph:]除了空格符 (空格键与 [Tab] 按键) 外的其他所有按键
    [:lower:]代表小写字符,亦即 a-z
    [:print:]代表任何可以被打印出来的字符
    [:punct:]代表标点符号 (punctuation symbol),亦即: " ' ? ! ; : # $...
    [:upper:]代表大写字符,亦即 A-Z
    [:space:]任何会产生空白的字符,包括空格键, [Tab], CR 等等
    [:xdigit:]代表 16 进位的数字类型,因此包括: 0-9, A-F, a-f 的数字与字符

Linux三剑客之一 —— grep

  1. grep 进阶选项

    [aweip@Manjaro ~]$ grep [-A] [-B] [--color=auto] '搜寻字符串' filename

    -A :后面可加数字, 为 after 的意思,除了列出该行外,后续的 n 行也列出来;

    -B :后面可加数字, 为 befer 的意思,除了列出该行外,前面的 n 行也列出来;

    --color=auto 可将正确的那个撷取数据列出颜色

    • 范例一:用 dmesg 列出核心讯息,再以 grep 找出内含 qxl 那行

      
      [aweip@Manjaro ~]$ dmesg | grep 'qxl'
      [ 0.522749] [drm] qxl: 16M of VRAM memory size
      [ 0.522750] [drm] qxl: 63M of IO pages memory ready (VRAM domain)
      [ 0.522750] [drm] qxl: 32M of Surface memory size
      [ 0.650714] fbcon: qxldrmfb (fb0) is primary device
      [ 0.668487] qxl 0000:00:02.0: fb0: qxldrmfb frame buffer device
      # dmesg 可列出核心产生的讯息, 包括硬件侦测的流程也会显示出来
      # 透过 grep 来 qxl 虚拟卡的相关信息,可发现如上信息
      
    • 范例二:承上题,要将捉到的关键词显色,且加上行号来表示

      
      [aweip@Manjaro ~]$ dmesg | grep -n --color=auto 'qxl'
      515:[ 0.522749] [drm] qxl: 16M of VRAM memory size
      516:[ 0.522750] [drm] qxl: 63M of IO pages memory ready (VRAM domain)
      517:[ 0.522750] [drm] qxl: 32M of Surface memory size
      529:[ 0.650714] fbcon: qxldrmfb (fb0) is primary device
      539:[ 0.668487] qxl 0000:00:02.0: fb0: qxldrmfb frame buffer device
      # 除了 qxl 会有特殊颜色来表示之外,最前面还有行号, 其实颜色显示已经是默认在 alias 当中了
      
    • 范例三:承上题,在关键词所在行的前两行与后三行也一起捉出来显示

      
      [aweip@Manjaro ~]$ dmesg | grep -n -A3 -B2 --color=auto 'qxl'
      # 关键词之前与之后的数行也被显示出来, 这样可以将关键词前后数据提出来进行分析
      
  2. 基础正则表达式练习

    • 例题一 : 搜寻特定字符串

      
      [aweip@Manjaro ~]$ grep -n 'the' regular_express.txt
      # 寻找包含 test 这一字符的行
      
      [aweip@Manjaro ~]$ grep -vn 'the' regular_express.txt
      # 列出不包含 the 的行
      
    • 例题二 : 利用中括号 [] 来搜寻集合字符

      
      [aweip@Manjaro ~]$ grep -n 't[ae]st' regular_express.txt
      # 寻找包含 tast 或 test 这一类字符的行
      
      [aweip@Manjaro ~]$ grep -n '[^g]oo' regular_express.txt
      # 反向选择 [^],寻找 oo 前面不是 g  的字符
      
      [aweip@Manjaro ~]$ grep -n '[^a-z]oo' regular_express.txt
      # [^a-z],寻找 oo 前面不是小写字母的字符
      
      [aweip@Manjaro ~]$ grep -n '[a-zA-Z0-9]' regular_express.txt
      # 取得有数字大小写字母的行
      
      [aweip@Manjaro ~]$ grep -n '[^[:lower:]]oo' regular_express.txt
      [aweip@Manjaro ~]$ grep -n '[[:digit:]]' regular_express.txt
      # 考虑到语系对于编码顺序的影响,可以直接使用特殊符号,[:lower:] 代表的就是 a-z 的意思
      
    • 例题三 :行首与行尾字符 ^ $

      
      [aweip@Manjaro ~]$ grep -n '^the' regular_express.txt
      # 取得 the 只在行首列出的行
      
      [aweip@Manjaro ~]$ grep -n '^[a-z]' regular_express.txt
      # 取得行首列为小写字母的行
      
      [aweip@Manjaro ~]$ grep -n '\.$' regular_express.txt
      # 取得行尾结束为小数点 (.) 的那一行
    • 例题四 : 任意一个字符 . 与重复字符 *

      • . (小数点):代表『一定有一个任意字符』的意思;
      • * (星星号):代表『重复前一个字符, 0 到无穷多次』的意思,为组合形态
      
      [aweip@Manjaro ~]$ grep -n 'g..d' regular_express.txt
      # 找到有 g_ _d 样式的长度为 四 的字符的行 
      
      [aweip@Manjaro ~]$ grep -n 'ooo*' regular_express.txt
      # 找到需要≥2个 o 以上的字符串,第一个 oo 肯定必须要存在,第二个 o 则是可有可无的多个 o
      
      [aweip@Manjaro ~]$ grep -n 'g.*g' regular_express.txt
      # 『.*』代表零个或多个任意字符
      
    • 例题五 : 限定连续 RE 字符范围 {}

      
      [aweip@Manjaro ~]$ grep -n 'o\{2\}' regular_express.txt
      # 因为 { 与 } 的符号在 shell 是有特殊意义的,因此必须要使用跳脱字符 \ 来让其失去特殊意义
      # 限制一个范围区间内的重复字符数为2,即要找到两个 o 的字符串
      
      [aweip@Manjaro ~]$ grep -n 'go\{2,5\}g' regular_express.txt
      # 找出 g 后面接 2 到 5 个 o ,然后再接一个 g 的字符串
      
  3. 基础正则表达式字符汇整 (characters)

    RE 字符意义与范例
    ^word意义:待搜寻的字符串(word)在行首! 范例:搜寻行首为 # 开始的那一行,并列出行号 grep -n '^#' regular_express.txt
    word$意义:待搜寻的字符串(word)在行尾! 范例:将行尾为 ! 的那一行打印出来,并列出行号 grep -n '!$' regular_express.txt
    .意义:代表『一定有一个任意字符』的字符! 范例:搜寻的字符串可以是 (eve) (eae) (eee) (e e), 但不能仅有 (ee) !亦即 e 与 e 中间『一定』仅有一个字符,而空格符也是字符! grep -n 'e.e' regular_express.txt
    \意义:跳脱字符,将特殊符号的特殊意义去除! 范例:搜寻含有单引号 ' 的那一行! grep -n \' regular_express.txt
    *意义:重复零个到无穷多个的前一个 RE 字符 范例:找出含有 (es) (ess) (esss) 等等的字符串,注意,因为 可以是 0 个,所以 es 也 是符合带搜寻字符串。另外,因为 为重复『前一个 RE 字符』的符号, 因此,在* 之前必须 要紧接着一个 RE 字符喔!例如任意字符则为 『._』 ! grep -n 'ess_' regular_express.txt
    [list]意义:字符集合的 RE 字符,里面列出想要撷取的字符! 范例:搜寻含有 (gl) 或 (gd) 的那一行,需要特别留意的是,在 [] 当中『谨代表一个待搜寻 的字符』, 例如『 a[afl]y 』代表搜寻的字符串可以是 aay, afy, aly 即 [afl] 代表 a 或 f 或 l 的意思! grep -n 'g[ld]' regular_express.txt
    [n1-n2]意义:字符集合的 RE 字符,里面列出想要撷取的字符范围! 范例:搜寻含有任意数字的那一行!需特别留意,在字符集合 [] 中的减号 - 是有特殊意义的, 他代表两个字符之间的所有连续字符!但这个连续与否与 ASCII 编码有关,因此,你的编码需要 设定正确(在 bash 当中,需要确定 LANG 与 LANGUAGE 的变量是否正确! ) 例如所有大写字 符则为 [A-Z] grep -n '[A-Z]' regular_express.txt
    [^list]意义:字符集合的 RE 字符,里面列出不要的字符串或范围! 范例:搜寻的字符串可以是 (oog) (ood) 但不能是 (oot) ,那个 ^ 在 [] 内时,代表的意义是『反向选择』的意思。 例如,我不要大写字符,则为 [^A-Z]。但是,需要特别注意的是, 如果以 grep -n [^A-Z] regular_express.txt 来搜寻,却发现该文件内的所有行都被列 出,为什么?因为这个 [^A-Z] 是『非大写字符』的意思, 因为每一行均有非大写字符,例如第 一行的 "Open Source" 就有 p,e,n,o.... 等等的小写字 grep -n 'oo[^t]' regular_express.txt
    {n,m}意义:连续 n 到 m 个的『前一个 RE 字符』 意义:若为 {n} 则是连续 n 个的前一个 RE 字符, 意义:若是 {n,} 则是连续 n 个以上的前一个 RE 字符! 范例:在 g 与 g 之间有 2 个到 3 个的 o 存在的字符串,亦即 (goog)(gooog) grep -n 'go{2,3}g' regular_express.txt

Linux三剑客之二 —— sed

  1. sed 工具

    [aweip@Manjaro ~]$ sed [-nefr] [动作]

    -n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到屏幕上。但如果加上 -n 参数后, 则只有经过 sed 特殊处理的那一行(或者动作)才会被列出来。

    -e :直接在指令列模式上进行 sed 的动作编辑;

    -f :直接将 sed 的动作写在一个文件内, -f filename 则可以执行 filename 内的 sed 动作;

    -r : sed 的动作支持的是延伸型正则表达式的语法。 (预设是基础正则表达式语法)

    -i :直接修改读取的文件内容,而不是由屏幕输出。

    动作说明: [n1,n2]function n1, n2 :不见得会存在,一般代表『 选择进行动作的行数』, 举例来说,如果我的动作 是需要在 10 到 20 行之间进行的, 则__10,20/[动作行为] __

    a :新增append, a 的后面可以接字符串,而这些字符串会在目前的下一行出现

    c :取代, c 的后面可以接字符串,这些字符串可以取代 n1,n2 之间的行

    i :插入, i 的后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行)

    d :删除,因为是删除,所以 d 后面通常不接任何字符

    p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运作

    s :取代,可以直接进行取代的工作,通常这个 s 的动作可以搭配正则表达式,例如 1,20s/old/new/g 就是

    • 以行为单位的新增/删除功能

      • 范例一: 将 /etc/passwd 的内容列出并且打印行号,同时, 请将第 2~5 行删除!

        
        [aweip@Manjaro ~]$ nl /etc/passwd | sed '2,5d'
        # sed 的动作为 '2,5d' , d 就是删除,2,5即删除 2-5 行
        # sed 后面接的动作,请务必以 '' 两个单引号括住
        
        [aweip@Manjaro ~]$ nl /etc/passwd | sed '3,$d'
        # 删除第 3 到最后一行,钱字号『 $ 』代表最后一行
      • 范例二:承上题,在第二行后(亦即是加在第三行)加上『 drink tea?』字样

        
        [aweip@Manjaro ~]$ nl /etc/passwd | sed '2a drink tea'
        # a(append),在第二行后添加,要在第二行前则将『 a 』变成『 i 』即可
        
        [aweip@Manjaro ~]$ nl /etc/passwd | sed '2a Drink tea or ......\
        > drink beer ?'
        # 新增不只一行,但是每一行之间都必须要以反斜杠『 \ 』来进行新行的增加
    • 以行为单位的取代与显示功能

      • 范例三: 将第 2-5 行的内容取代成为『No 2-5 number』

        
        [aweip@Manjaro ~]$ nl /etc/passwd | sed '2,5c No 2-5 number
        # '_,_c 内容'
      • 范例四: 仅列出 /etc/passwd 文件内的第 5-7 行

        
        [aweip@Manjaro ~]$ nl /etc/passwd | sed -n '5,7p'
        #  -n 代表的是『安静模式』
    • 部分数据的搜寻并取代的功能

      sed 's/要被取代的字符串/新的字符串/g'

      • 范例五: sed与正则表达式配合练习

        • 步骤一:先使用 grep 将关键词 MAN 所在行取出

          
          [aweip@Manjaro ~]$ cat /etc/man_db.conf | grep 'MAN'
          # MANDATORY_MANPATH manpath_element
          # MANPATH_MAP path_element manpath_element
          # MANDB_MAP global_manpath [relative_catpath]
          # every automatically generated MANPATH includes these fields 
        • 步骤二: 删除掉批注之后的数据

          
          [aweip@Manjaro ~]$ cat /etc/man_db.conf | grep 'MAN'| sed 's/#.*$//g
          
          MANDATORY_MANPATH /usr/man
          # ...省略
          
          # 从上面可以看出来,原本批注的数据都变成空白行啦!所以,接下来要删除掉空白行
          [aweip@Manjaro ~]$ cat /etc/man_db.conf | grep 'MAN'| sed 's/#.*$//g' | sed '/^$/d'
          MANDATORY_MANPATH /usr/man
          MANDATORY_MANPATH /usr/share/man
          MANDATORY_MANPATH /usr/local/share/man
    • 直接修改文件内容(危险动作)

      • 范例六:利用 sed 将 regular_express.txt 内每一行结尾若为 . 则换成 !

        
        [aweip@Manjaro ~]$ sed -i 's/\.$/\!/g' regular_express.txt
        # 上头的 -i 选项可以让你的 sed 直接去修改后面接的文件内容而不是由屏幕输出喔!
        # 这个范例是用在取代! 请您自行 cat 该文件去查阅结果啰!
      • 范例七:利用 sed 直接在 regular_express.txt 最后一行加入『# This is a test』

        
        [aweip@Manjaro ~]$ sed -i '$a # This is a test' regular_express.txt
        # 由于 $ 代表的是最后一行,而 a 的动作是新增,因此该文件最后新增

延伸正则表达式

基础的就基本扎布多德勒

文件的格式化与相关处理

  1. 格式化打印: printf

    [dmtsai@study ~]$ printf '打印格式' 实际内容

    \a 警告声音输出
    \b 退格键(backspace)
    \f 清除屏幕 (form feed)
    \n 输出新的一行
    \r 亦即 Enter 按键
    \t 水平的 [tab] 按键
    \v 垂直的 [tab] 按键
    \xNN NN 为两位数的数字,可以转换数字成为字符
    • 范例一: 将数据的文件 (printf.txt) 内容仅列出姓名与成绩: (用 [tab] 分隔)

       
      [dmtsai@study ~]$ printf '%s\t %s\t %s\t %s\t %s\t \n' $(cat printf.txt)
      Name Chinese English Math Average
      DmTsai 80 60 92 77.33
      VBird 75 55 80 70.00
      Ken 60 90 70 73.33
    • 范例二: 将上述资料关于第二行以后,分别以字符串、整数、小数点来显示

       
      [dmtsai@study ~]$ printf '%10s %5i %5i %5i %8.2f \n' $(cat printf.txt | grep -v Name)
      DmTsai 80 60 92 77.33
      VBird 75 55 80 70.00
      Ken 60 90 70 73.33
    • 范例三:列出 16 进位数值 45 代表的字符

       
      [dmtsai@study ~]$ printf '\x45\n'
      E

Linux三剑客之三——awk

  1. awk:好用的数据处理工具 , awk 主要是处理『每一行的字段内的数据』,而默认的『字段的分隔符为 "空格键" 或 "[tab]键" 』

    [dmtsai@study ~]$ awk '条件类型 1{动作 1} 条件类型 2{动作 2} ...' filename

    • 举例

       
      [dmtsai@study ~]$ last -n 5 <==仅取出前五行
      dmtsai pts/0 192.168.1.100 Tue Jul 14 17:32 still logged in
      dmtsai pts/0 192.168.1.100 Thu Jul 9 23:36 - 02:58 (03:22)
      dmtsai pts/0 192.168.1.100 Thu Jul 9 17:23 - 23:36 (06:12)
      dmtsai pts/0 192.168.1.100 Thu Jul 9 08:02 - 08:17 (00:14)
      dmtsai tty1 Fri May 29 11:55 - 12:11 (00:15)
      
      # 取出账号与登入者的 IP ,且账号与 IP 之间以 [tab] 隔开
      [dmtsai@study ~]$ last -n 5 | awk '{print $1 "\t" $3}'
      dmtsai 192.168.1.100
      dmtsai 192.168.1.100
      dmtsai 192.168.1.100
      dmtsai 192.168.1.100
      dmtsai Fri

      awk 后续的所有动作是以单引号『 ' 』括住的

    • awk 的内建变量

      变量名称 代表意义
      NF每一行 ($0) 拥有的字段总数
      NR目前 awk 所处理的是『第几行』数据
      FS目前的分隔字符,默认是空格键
    • awk 的逻辑运算字符

      算单元代表意义
      >大于
      <小于
      >=大于或等于
      <=小于或等于
      ==等于
      !=不等于

声明:AweiP Cache|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - LINUX学习笔记——Shell与正则表达式


且愿饮冰而热血不凉