net25 第15周作業

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

SED

sed模式空間
默認不編輯源文件,僅對模式空間中的數據做處理:而后,處理結束后,將模式空間打印屏幕

sed [options]'address+command' file...
-n:靜默模式,不再默認顯示模式空間的內容
-i:直接修改原文件
-e script -e script 同時執行多個腳本
-f /path/to/script file
-r :表示使用擴展正則表達式
address:
1.startline,endline
比如1,100
2./regexp/
/^root/
3./pattern1/,/pattern2/
第一次被pattern1匹配到的行開始,至第一次被pattern2匹配到的行結束,這中間的所以行
4.linenumber
指定行
5.startline,+N
從startline開始,向后的n行
6.步進行
 1~2  奇數行
 2~2  偶數行
7.$ 最后一行

command:
d:刪除符合條件的行
P: 顯示符合條件的行
a \string:在指定的行后面追加新行,內容為“string”
i \string:在指定的行前面追加新行,內容為“string”
c \string:將匹配到的的行替換為此處指定的文本text
r file:文件合并
w file:將地址指定的范圍內的行另存為至指定文件中
=:為模式匹配到的行數的行打印行號
!取反
地址定界!編輯命令
s/pattern/string/修飾符:查找并替換,默認只替換每一行被模式匹配到的字符串
加修飾符
g:全局替換
i:忽略字符大小寫
w /path/to/somefile:將替換成功的結果保存至指定文件中
p:顯示替換成功的行
s///=s###=s@@@
\(\),\1,\2  sed ‘s/l..k/&r/g’  sed 's/\(l..k\)/\1r/g '
&:引用匹配模式的整個串



高級編輯命令
h:表示把模式空間的內容保存至保持空間
H:把模式空間中的內容追加至保持空間
g:把保持空間的內容覆蓋至模式空間
G:把保持空間的內容追加至模式空間
x:把模式空間的內容與保持空間中內容互換
n:讀取匹配到行的下一行至模式空間
N: 追加讀取匹配到的行的下一行至模式空間中
D:刪除多行模式空間中所有行

AWK

內建變量

FS:input field seperator,默認為空白字符

OFS:output field seperator,默認為空白字符

RS:input record seperator,輸入時的換行符

ORS:outpout record seperator,輸出時的換行符

NF:number of filed,字段數量 {print NF},{print $NF}

NR:number of record,行數

FNR:各文件分別計數,行數

FILENMAE當前文件名字

ARGC: 命令行參數的個數

ARGV: 數組,保存的是命令行所給定的各參數

printf命令

格式化輸出:printf format,item1,item2...

(1)format必須給出
(2)不會自動換行,需要顯式給出換行符,\n
(3)format中需要分別為后面的每個item指定一個
格式化符號

%c:顯示字符串的ascii碼
%d,%i:顯示十進制整數
%e,%E:科學計數法數值顯示
%f,顯示為浮點型
%g,%G:以科學計數法或浮點型形式顯示數值
%s:顯示字符串
%u:無字符串
%%:顯示%本身

條件表達式:

selector?if-true-expression:if-false-expression

eg:

awk -F: '{$3>=1000?usertype='common user':usertype="system admin";printf "%15s:%-s\n",$1,usertype}'
awk -F: 'printf "%15s:%-s",%1,(%3>1000?"common user":"system user")'
pattern

(1)empty 空模式,匹配每一行
(2)/regular expression/:僅處理能夠被此處的模式匹配到的行
(3)relational expression:關系表達式,結果有“真”有“假”,結果為真才會處理
eg:

awk -F':' '$NF==/bin/bash {print $1,$NF}' /etc/passwd
awk -F':' '$NF~/bash$/ {print $1,$NF}' /etc/passwd
line range:行范圍
startline,endline:/pat1/,/pat2/

注意;不支持直接給出數字的格式

~]# awk -F : '(NR>=2&&NR<=10){print $1}' /etc/passwd

BEGIN/END模式

BEGIN{}:僅在開始處理文件中文本之前執行一次 END{}:僅在文本處理完成之后執行一次

常見的action

(1)expression
(2)control statements: if,while等
(3)compound statement:組合語句
(4)input statement
(5)output statement

控制語句

if(condition){statment}

if(condition){statment} else {statement}

while(condition){statement}

do{statement} while(codition)

for(exp1,exp2,exp3){statement}

break

continue

delete arry[index]

delete arry

exit

{statement}

if-else

語法:if(condition) statement [else statement]

awk -F: '{if($3>1000) print $1,$3}' /etc/passwd
awk -F: '{if($3>=1000) {printf "common user: %s\n",$1} else {printf "root or system:%s\n",$1} }' /etc/passwd
使用場景:對awk取得的整行或某個字段做條件判斷;

while循環
語法:while(condition) statement

使用場景:對一行內的多個字段逐一類似處理時使用,對數組中逐一處理時使用

awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {print $i,length($i); i++}}' /boot/grub2/grub.cfg
awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>7){print $i,length($i)}; i++}}' /boot/grub2/grub.cfg
do-wile循環
語法:do statement while(condition)

意義;至少執行一次循環

for循環
語法:for(epr1;epr2;epr3) statement

awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}' /boot/grub2/grub.cfg
awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {if(length($i) > 7){print $i,length($i)}}}' /boot/grub2/grub.cfg
特殊用法:

能夠遍歷數組中的元素:

語法: for(var in arry) (for-body)

switch語句
語法:switch(expression){case VALUE or /REGEXP/:statement;case VALUE2 or /REGEXP2/: statement;...;default:statement}

break和continue
break [n] continue

next 提前結束對本行的處理而直接進入下一行
awk -F: '{if($3%2!=0) next;print $1,$3}' /etc/passwd
awk 數組
關聯數組:array[index-expression]

index-expression:

(1)可使用任意字符串,字符串要加雙引號
(2)如果某組元素事先不存在,在引用時,awk會自動創建此元素,并將某值初始化為“空串”:
若要判斷數組中是否存在某元素,要使用“index in array”格式進行

若要遍歷數組中的每個元素,要使用for循環

awk 'BEGIN{weekdays["mon"]="monday";weekdays["tue"]="tuesday";for(i in weekdays) {print weekdays[i]}}'
注意:var會遍歷array的每個索引

netstat -nta | awk '/^tcp\>/{state[$NF]++}END{for(i in state){print i,state[i]}}'
統計指定文件中每個單詞出現的次數

awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count){print i,count[i]}}' /etc/fstab

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

vim: %s@^[[:space:]]+@@g

sed:sed -i -r ‘s/^[[:space:]]+//g’ /boot/grub/grub.conf

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

vim: %s@^#[[:space:]]+@@g

sed: sed -i -r ‘s/^#[[:space:]]+//g’ /etc/fstab

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

sed: sed -n ‘1~2p’ /etc/fstab > /tmp/fstab.3

sed: sed ‘n;d’ /etc/fstab > /tmp/fstab.3

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

echo “/etc/fstab/tab” | sed -r -n ‘s@^/.*/([^/]+$)@\1@p’

echo “/etc/fstab/tab/tab1” | sed -r -n ‘s@(^/.*/)[^/]+$@\1@p’

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

awk ‘{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count){print i,count[i]}}’ /boot/grub/grub.conf

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

netstat -nta | awk ‘/^tcp>/{count[$6]++}END{for(i in count){print i,count[i]}}’

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

awk ‘{count[$1]++}END{for(i in count){print i,count[i]}}’ access.log

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

#!/bin/bash
declare -A logs
for i in `ls /var/log/*.log`;do
    log_lines=`wc -l $i`
    logs[$i]=$log_lines
    echo "${logs[$i]}"
done

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

#!/bin/bash

if [ $1 ];then
    for((i=1;i<=$1;i++));then
        a=$[$RANDOM%11]
        echo $a
else
    a=$[$RANDOM%11]
    echo $a
fi

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

visudo

centos   ALL=(root)   NOPASSWD:/usr/sbin/fdisk  /usr/sbin/mkfs /sbin/mke2fs

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

visudo
Cmnd_Alias LVM=/sbin/pvcreate  /sbin/vgcreate /sbin/lvcreate /sbin/vgextend /sbin/lvextend

gentoo ALL=(root) NOPASSWD:LVM

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

~]# vim /etc/pam.d/sshd 
#%PAM-1.0
auth       required     pam_sepermit.so
auth       include      password-auth
account    required     pam_nologin.so
account    required     pam_time.so
account    include      password-auth
password   include      password-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open env_params
session    required     pam_namespace.so
session    optional     pam_keyinit.so force revoke
session    include      password-auth

~]# /etc/security/time.conf
sshd;*;root;Wk0900-1800

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

]# vim sshd 
#%PAM-1.0
auth       required     pam_sepermit.so
auth       include      password-auth
account    required     pam_nologin.so
account    required     pam_listfile.so item=user sense=allow  file=/etc/user_allow onerr=succeed
account    required     pam_time.so
account    include      password-auth
password   include      password-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open env_params
session    required     pam_namespace.so
session    optional     pam_keyinit.so force revoke
session    include      password-auth

~]# vim /etc/user_allow
root

~]#chmod 600 /etc/user_allow

原創文章,作者:N25_隨心,如若轉載,請注明出處:http://www.www58058.com/73655

(0)
N25_隨心N25_隨心
上一篇 2017-05-15
下一篇 2017-05-15

相關推薦

  • ldirectord 結合ipvsadm 配置nat,dr模型

    ldirectord 結合ipvsadm 配置nat,dr模型  一、nat模型 1、 drector # wget ftp://172.16.0.1/pub/Sources/7.x86_64/crmsh/ldirectord-3.9.6-0rc1.1.1.x86_64.rpm # yum -y install nginx (同…

    Linux干貨 2016-11-24
  • 時間、screen、echo等——Linux基本命令(5)

    1.     時間 (1)查詢時間: date          +%F  年月日          +%T  時分秒  &nbs…

    2017-07-13
  • 2016/08/07:文本處理工具及正則表達式

      在本次課程中,本以為和前面的內容難度差不多,內心毫無提防,但在做隨堂練習的時候,被慘虐,不由得使我想起了高三時候拿到一張數學單元練習題,一道題也不會做的那種感覺,無助,彷徨,不甘。到了晚上總結了一下,還是有緣由可尋的。直接原因就是前面知識記得不牢固,也并未完全理解是和意思,尤其是tr命令,適用于何處,沒按照5W1H方法來進行總結學習,導致應用的…

    Linux干貨 2016-08-07
  • 第一周作業

    1. 描述計算機的組成及其功能 CPU:CPU包括運算器和控制器,并采用大規模集成電路工藝制成的芯片,又稱微處理器芯片。 運算器又稱算術邏輯單元(Arithmetic Logic Unit簡稱ALU)。它是計算機對數據進行加工處理的部件,包括算術運算(加、減、乘、除等)和邏輯運算(與、或、非、異或、比較等)。 控制器負責從存儲器中取出指令,并對指令進行譯碼;…

    Linux干貨 2017-01-04
  • 第3周作業

    一、列出當前系統上的所有已經登錄的用戶的用戶名 [root@bogon tmp]# who | cut -d ” ” -f1 | sort -urootwing[root@bogon tmp]# who | cut -d ” ” -f1 | uniqrootwing 二、取出最后登錄到當前系統的用戶相關信息 […

    Linux干貨 2017-07-25
  • 網絡管理

    1、集線器、交換機、路由器 2、路由器與交換機的主要區別體現在以下幾個方面: 1)工作層次不同:最初的的交換機是工作在OSI/RM開放體系結構的數據鏈路層,也就是第二層,而路由器一開始就設計工作在OSI模型的網絡層。由于交換機工作在OSI的第 二層(數據鏈路層),所以它的工作原理比較簡單,而路由器工作在OSI的第三層(網絡層),可得到更多的協議信息,路由器可…

    Linux干貨 2016-09-08

評論列表(1條)

  • 馬哥教育
    馬哥教育 2017-06-20 10:15

    寫的很好,為什么中間部分的排版跟別的不一樣那

欧美性久久久久