N26-博客作業-week15

1、總結sed和awk的詳細用法

sed:
    語法結構
    sed [OPTION]...'script' [input-file]...[action]
        -r:支持擴展正則表達式
        -n:不輸出模式空間中的內容至屏幕
        -e script1 -e script2 -e script3:指定多腳本運行
        -f /path/to/script_file:從指定的文件中讀取腳本運行
        -i:直接修改源文件
    
    sed的地址定界
        #:#表示數字,指定行
        $:最后一行
        /pattern/或%pattern%:任何能被pattern匹配到的行
        
            #,/pattern/:從第#行開始,到第一次被pattern匹配到的行結束,中間的所有行
            #1,#2:從#1到#2行
            /pattern1/,/pattern2/:從第一次被pattern1匹配到的行開始,到第一次被pattern2匹配到的行結束,中間的所有行
            #,+n:從#行開始,一直到向下的n行
        1~2:所有奇數行
        2~2:所有偶數行
            
    sed的編輯命令
        d:刪除模式空間中的行
        =:為模式空間中的行打印行號
        a \text:在行后面追加文本,支持使用\n實現多行追加
        i \text:在行前面追加文本,支持使用\n實現多行追加
        c \text:用text替換匹配到的行
        p:打印模式空間中的行
        s///:查找替換,其分隔符可自行指定,常用的有s@@@, s###等;
            替換標記:
                g:全局替換;
                w /PATH/TO/SOMEFILE:將替換成功的結果保存至指定文件中;
                p:顯示替換成功的行;
        w /path/to/somefile:保存模式空間匹配到的行至指定的文件中;
        r /path/from/somefile:讀取指定文件的內容至當前文件被模式匹配到的行后面;文件合并;
        
    高級編輯命令:
        h:把模式空間中的內容覆蓋至保持空間中;
        H:把模式空間中的內容追加至保持空間中;
        g:把保持空間中的內容覆蓋至模式空間中;
        G:把保持空間中的內容追加至模式空間中;
        x:把模式空間中的內容與保持空間中的內容互換;
        n:覆蓋讀取匹配到的行的下一行至模式空間中;
        N:追加讀取匹配到的行的下一行至模式空間中;
        d:刪除模式空間中的行;
        D:刪除多行模式空間中的所有行;
        
awk:
    awk的運行模式有三種:
        (1)awk 命令行
            # awk
        (2)awk 程序文件
            # awk -f /path/from/awk_script
        (3)awk 腳本
            # !/bin/awk -f
            
    awk的基本用法:awk [OPTION] 'program' FILE1 FILE2...
    其中program:PATTERN{Action STATEMENT}
        program:編程語言
        PATTERN:模式
        ACTION STATEMENT:動作語句,可以是由多個語句組成,各語句間使用分號隔離;
        
    OPTONS:
        -F[]:指明輸入字段分隔符;
        -v VAR_NAME=VALUE:變量賦值;
        -f /PATH/FROM/AWK_SCRIPT;
        
    awk在處理文本時也是一次讀取一行文本,然后根據輸入分隔符(默認為空格)進行切片,切成n個片段,然后將每一片都賦予awk內部的一個變量中進行保存,
    這些變量名為$1、$2、$3...,awk就可以對這些片段單獨處理,
    
    awk的輸出命令之print
        用法:print item1,item2,...
            item:字符串,用引號引用
                print "hello","world"
            變量:顯示變量的值,可以直接使用變量的名進行引用
                print name 
            數值:無需加引號
            
        注:
            (1)各item之間要使用逗號隔開,輸出時的分隔符默認為空白字符
            (2)輸出的各item可以為字符串或數值,當前記錄的字段($#),變量或awk的表達式;數值會被隱式轉換為字符串進行輸出
            (3)print后面的item省略時,相當于運行“print $0”,用于輸出整行
            (4)輸出空白字符 print " "
        變量
            分為內建變量和自定義變量
            
            內建變量:
                FS:input Field Seperator,輸入字段分隔符,默認為空白字符
                RS:input Record Seperator,輸入時的行分隔符,默認為換行符
                OFS:Output Field Seperatro,輸出時的字段分隔符,默認為空白字符
                ORS:Output Record Seperator,輸出時的行分隔符,默認為換行符
                NF:number of field in current record,當前行的字段數
                    print NF:顯示當前行的字段數
                    print $NF:顯示當前行的第NF字段的值
                NR:number of records,行數;命令后跟的所有文件將統一合并計數
                FNR:行數,各文件單獨計數
                FILENAME:當前正被awk讀取的文件的文件名
                ARGC:awk命令行中的參數的個數
                ARGV:數組,保存了命令行參數本身
                    ARGV[index]
                    ARGV[0],ARGV[1]
                    
        自定義變量
            (1)-v VAR_NAME=VALUE變量名區分字符大小寫
            (2)在program中自定義變量

    awk的輸出命令之printf格式化輸出
        語法:printf FORMAT,item1,item2,...
        
        注:
            (1)必須提供FORMAT
            (2)與print語句不同,printf不會自動換行,需要顯示指定換行符:\n
            (3)FORMAT中需要分別為后面的每個item指定一個格式符,否則item無法顯示
                格式符:都以%開頭,后面跟單個字符
                    %c:顯示字符的ASCII碼
                    %d,%i:顯示為十進制整數
                    %e,%E:科學計數法或浮點數格式顯示數值
                    %f:顯示為浮點數
                    %g,%G:以科學計數法或浮點數格式顯示數值
                    %s:顯示為字符串
                    %u:顯示無符號整數
                    %%:顯示%符號自身
                    
    awk的操作符:
        awk的操作符有:算術操作符、字符操作符、賦值操作符、比較操作符、模式匹配操作符、邏輯操作符、條件表達式和函數調用
        
            算術操作符:實現一些算術運算
            字符操作符:字符串連接
            賦值操作符:通常為變量的賦值
                =,+=,-=,*=,/=,%=,^=
                ++,--
            比較操作符:字符串或者數值的大小比較
                >,>=,<,<=,==,!=
            模式匹配操作符:根據右側的模式進行匹配操作
                ~:是否能由右側指定的模式所匹配
                !~:是否不能由右側指定的模式所匹配
            邏輯操作符:進行邏輯的運算
                &&:與運算
                ||:或運算
            條件表達式:
                selector?if-trun-expression:if-false-expression
            函數調用:調用函數來進行數據的處理
                格式:function_name(argu1,argu2,...)
            
            PATTERN
                (1)empty:空模式,匹配每一行;
                (2)/regular expression/:僅處理能夠被此處的模式匹配到的行;
                (3)relational expression: 關系表達式;結果有“真”有“假”;結果為“真”才會被處理;
                    真:結果為非0值,非空字符串;
                (4)line ranges:行范圍,
                    startline,endline:/pat1/,/pat2/

                    注意: 不支持直接給出數字的格式
                    ~]# awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd
                (5)BEGIN/END模式
                    BEGIN{}: 僅在開始處理文件中的文本之前執行一次;
                    END{}:僅在文本處理完成之后執行一次;
            
            常用的action
                (1)Expressions
                (2)Control statements:if, while等;
                (3)Compound statements:組合語句;
                (4)input statements
                (5)output statements            
                
            控制語句
                if(condition) {statments} 
                if(condition) {statments} else {statements}
                while(conditon) {statments}
                do {statements} while(condition)
                for(expr1;expr2;expr3) {statements}
                break
                continue
                delete array[index]
                delete array
                exit 
                { statements }
            
            數組
                關聯數組:array[index-expression]

                index-expression:
                    (1)可使用任意字符串;字符串要使用雙引號;
                    (2)如果某數組元素事先不存在,在引用時,awk會自動創建此元素,并將其值初始化為“空串”;
                    若要判斷數組中是否存在某元素,要使用"index in array"格式進行;
                    weekdays["mon"]="Monday"
                若要遍歷數組中的每個元素,要使用for循環;
                    for(var in array) {for-body}
            
            函數
                內置函數
                    數值處理:
                        rand():返回0和1之間一個隨機數;

                    字符串處理:
                        length([s]):返回指定字符串的長度;
                        sub(r,s,[t]):以r表示的模式來查找t所表示的字符中的匹配的內容,并將其第一次出現替換為s所表示的內容;
                        gsub(r,s,[t]):以r表示的模式來查找t所表示的字符中的匹配的內容,并將其所有出現均替換為s所表示的內容;
                        split(s,a[,r]):以r為分隔符切割字符s,并將切割后的結果保存至a所表示的數組中;
                自定義函數

2、刪除/boot/grub/grub.conf文件中所有行的行首的空白字符

# sed -r 's/^[[:space:]]+//' /boot/grub/grub.conf

3、刪除/etc/fstab文件中所有以#開頭,后跟至少一個空白字符的行的行首的#和空白字符

# sed -r 's/^[#][[:space:]]+//' /etc/fstab

#
/etc/fstab
Created by anaconda on Thu Jun 15 06:05:04 2017
#
Accessible filesystems, by reference, are maintained under '/dev/disk'
See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=78793bbc-ce37-49e2-91c3-ce7119a6c9f3 /                       xfs     defaults        0 0
UUID=b03e3066-407e-445a-8e11-08a1d91d042d /boot                   xfs     defaults        0 0
UUID=cbe5fb6e-c8ca-4e7f-84a0-c19967b93c41 swap                    swap    defaults        0 0

4、把/etc/fstab文件的奇數行另存為/tmp/fstab.3

# sed '1~2w /tmp/fstab.3' /etc/fstab
# cat /tmp/fstab.3

# /etc/fstab
#
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
UUID=78793bbc-ce37-49e2-91c3-ce7119a6c9f3 /                       xfs     defaults        0 0
UUID=cbe5fb6e-c8ca-4e7f-84a0-c19967b93c41 swap                    swap    defaults        0 0

5、echo一個文件路徑給sed命令,取出其基名;進一步地,取出其路徑名

# echo "/etc/fstab/xxxx/" | sed -r 's@^.*/([^/]+)/?$@\1@'
xxxx

6、統計指定文件中所有行中每個單詞出現的次數

# awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(j in count){print j,count[j]}}' /PATH/TO/SOMEFILE

7、統計當前系統上所有tcp連接的各種狀態的個數

# ss -tan | awk '!/^State/{state[$1]++}END{for(i in state){print i,state[i]}}'

8、統計指定的web訪問日志中各ip的資源訪問次數

awk '{ip[$1]++}END{for(i in ip){print i,ip[i]}}' /var/log/httpd/wp.access

9、寫一個腳本:定義一個數組,數組元素為/var/log目錄下所有以.log結尾的文件的名字;顯示每個文件的行數

# vim logcount.sh

#!/bin/bash
#
declare -a rows
declare -a FileNames

for i in /var/log/*.log; do
    rows=$(cat $i | wc -l)
    FileNames=${i##*/}
    printf "%-30s %s\n" $FileNames $rows
done

# bash -n logcount.sh
# bash logcount.sh
boot.log                       236
vmware-vmsvc.log               413
vmware-vmusr.log               21
wpa_supplicant.log             19
Xorg.0.log                     404
yum.log                        723

10、寫一個腳本,能從所有同學中隨機挑選一個同學回答問題;進一步地:可接受一個參數,做為要挑選的同學的個數

#!/bin/bash
#
declare -a Students

Students=(Jose David Antonio Eric Victor Luke Ander Paul Michael Lukaku Mkhitaryan Rashford)

read -p "Please chose a number [1-${#Students[@]}]: " num

if [[ $num -lt 1 || $num -gt 12 ]];then
    echo -e  "An error choise!\nPlease chose from 1-${#Students[@]}"
    exit 2
else
    for ((i=0;i<$num;i++))
        do
            x=$[$RANDOM % ${#Students[@]}]
            echo ${Students[$x]}
            Students[$x]=${Students[${#Students[@]}-1]}
            unset Students[${#Students[@]}-1]
        done
fi

# bash students.sh 
Please chose a number [1-12]: 4
Eric
Ander
Lukaku
Antonio

11、授權centos用戶可以運行fdisk命令完成磁盤管理,以及使用mkfs或mke2fs實現文件系統管理

# visudo
centos  ALL=(root)  /sbin/fdisk, /sbin/mkfs, /sbin/mke2fs

12、授權gentoo用戶可以運行邏輯卷管理的相關命令

# visudoCmnd_Alias LVADMINS_CMD=/sbin/lvchange,/sbin/lvdisplay,/sbin/lvmchange,/sbin/lvmdiskscan,/sbin/lvmsadc,/sbin/lvremove,/sbin/lvs,/sbin/lvconvert,/sbin/lvextend,/sbin/lvmconf,/sbin/lvmdump,/sbin/lvmsar,/sbin/lvrename,/sbin/lvscan,/sbin/lvcreate,/sbin/lvm,/sbin/lvmconfig,/sbin/lvmetad,/sbin/lvreduce,/sbin/lvresize,/sbin/pvchange,/sbin/pvck,/sbin/pvcreate,/sbin/pvdisplay,/sbin/pvmove,/sbin/pvremove,/sbin/pvresize,/sbin/pvs,/sbin/pvscan,/sbin/vgcfgbackup,/sbin/vgck,/sbin/vgdisplay,/sbin/vgimport,/sbin/vgmknodes,/sbin/vgrename,/sbin/vgsplit,/sbin/vgcfgrestore,/sbin/vgconvert,/sbin/vgexport,/sbin/vgimportclone,/sbin/vgreduce,/sbin/vgs,/sbin/vgchange,/sbin/vgcreate,/sbin/vgextend,/sbin/vgmerge,/sbin/vgremove,/sbin/vgscan                gentoo          ALL=(ALL)       NOPASSWD:LVADMINS_CMD

13、基于pam_time.so模塊,限制用戶通過sshd服務遠程登錄只能在工作時間進行

# vim /etc/pam.d/sshd
account  required  pam_time.so

# vim /etc/security/time.conf
sshd;*;*;MoTuWeThFr0900-1800

14、基于pam_listfile.so模塊,定義僅某些用戶,或某些組內的用戶可登錄系統

# vim /etc/user_list
centos
fedora

# chmod 600 /etc/sshd_userlist

# vim /etc/pam.d/sshd
auth  required  item=user sense=allow file=/etc/users onerr=succeed

原創文章,作者:浙江-咲,如若轉載,請注明出處:http://www.www58058.com/80423

(0)
浙江-咲浙江-咲
上一篇 2017-07-14
下一篇 2017-07-14

相關推薦

  • 第三周博客作業

    who useradd usermod groupadd

    Linux干貨 2017-12-17
  • 學習札記:用戶管理,權限管理和ACL歡樂”斗地主”

    補充:touch /etc/nologin 啟動系統維護功能,其他用戶不能登陸,除了管理員,可以自定義內容,在普通用戶登陸的時候可以看到相關維護提示,解除維護模式的話,必須要刪除該文件,另外可以創建/run/nologin達到相同的效果(僅限于CentOS 7), 用戶屬性修改 usermod [OPTION] login -u UID: 新UID -g G…

    Linux干貨 2016-08-04
  • 文本處理及正則表達式

    文本處理工具:     more:分頁查看文件     less:分頁控制顯示文件     head 查看文件的前幾行         -n 3   顯示前三行      &nbs…

    Linux干貨 2017-05-31
  • ?Linux進程管理與性能分析

    Linux進程管理與性能分析 概述 系統維護的一個重要工作就是監控Linux系統的運行狀態是否正常,分析系統資源的使用情況,進而對系統進行優化,提高其性能。在實際環境中,系統穩定性尤為重要,可以說系統的穩定性關系到企業的存亡。因此,第一時間掌握CPU、Memory、IO、Network的等系統資源的狀態則可以在系統出現問題時及時解決,把損失降到最低。&nbs…

    Linux干貨 2016-09-11
  • 8-4 文本處理工具

    本節主要了解文本處理工具 文件查看命令:cat  tac  rev     cat [OPTION]… [FILE]…         -E:顯示行結束符$    &…

    Linux干貨 2016-08-07
  • 2

    2

    Linux干貨 2018-03-26

評論列表(1條)

  • 馬哥教育
    馬哥教育 2017-07-22 21:43

    sed, awk在手,天下我有,加油。

欧美性久久久久