Shell awk文本处理,shell脚本编写
Shell awk文本處理,shell腳本編寫
一:內容包含awk、變量、運算符、if多分支
<a>語法糖:
awk [options] 'commands' files
option
-F 定義字段分隔符,默認的分隔符是連續的空格或制表符
使用option中的-F參數定義間隔符號
用$1,$2,$3等的順序表示files中每行以間隔符號分隔的各列不同域
NF變量表示當前記錄的字段數
-v 定義變量并賦值 也可以借用次方式從shell變量中引入
command
<b>讀前處理 行處理 讀后處理:
1.讀前處理 BEGIN{awk_cmd1;awk_cmd2}
2.行處理:定址 命令?
定址方法: 正則,變量,比較和關系運算
<c>正則需要用//包圍起來?
^ 行首
$ 行尾
. 除了換行符以外的任意單個字符
* 前導字符的零個或多個
.* 所有字符
[] 字符組內的任一字符
[^] 對字符組內的每個字符取反(不匹配字符組內的每個字符)
^[^] 非字符組內的字符開頭的行
[a-z] 小寫字母
[A-Z] 大寫字母
[a-Z] 小寫和大寫字母
[0-9] 數字
\< 單詞頭 單詞一般以空格或特殊字符做分隔,連續的字符串被當做單詞
\> 單詞尾
<d>擴展正則 加 -r 參數 或轉義
sed -n '/roo\?/p' /etc/passwd?
sed -rn '/roo?/p' /etc/passwd
? 前導字符零個或一個
+ 前導字符一個或多個
abc|def abc或def
a(bc|de)f abcf 或 adef
x\{m\} x出現m次
x\{m,\} x出現m次至多次(至少m次)
x\{m,n\} x出現m次至n次
<e>NR變量定址?
NR 表示AWK讀入的行數
FNR表示讀入行所在文件中的行數
# awk '{print NR,FNR,$1}' file1 file2?
1 1 aaaaa
2 2 bbbbb
3 3 ccccc
4 1 dddddd
5 2 eeeeee
6 3 ffffff
#
邏輯運算 可直接引用域進行運算
== >= <= != > < ~ !~
# awk 'NR==1 {print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
#?
3.命令 {print $0}
4.讀后處理 END {awk_cmd1;awk_cmd2;}
<f>AWK變量
NR 當前記錄的個數(全部文件連接后的統計)?
FNR 當前記錄的個數(僅為當前文件的統計,非全部)
FS 字段分隔符 默認為連續空格或制表符,可以使用多個不同的符號做分隔符 -F[:/]
OFS 輸出字符的分隔符 默認是空格
# awk -F: 'OFS="=====" {print $1,$2}' /etc/passwd
root=====x
NF 當前讀入行的字段個數
ORS 輸出記錄分隔符 默認是換行
# awk -F: 'ORS="=====" {print $1,$2}' /etc/passwd
root x=====bin x=====
FILENAME 當前文件名
引用shell變量的方法
# a=root
# awk -v var=$a -F: '$1 == var {print $0}' /etc/passwd
或者 把整個命令拆開傳遞,讓shell變量外露,
# awk -F: '$1 == "'$a'" {print $0}' /etc/passwd
# a=NF
# awk -F: '{print $'$a'}' /etc/passwd?
操作符
賦值
= += -= /= *=?
邏輯與 邏輯或 邏輯非
&& || !
匹配正則或不匹配,正則需要用 /正則/ 包圍住
~ !~
關系 比較字符串時要把字符串用雙引號引起來
< <= > >= != ==
字段引用
$ 字段引用需要加$,而變量引用直接用變量名取
運算符
+ - * / % ++ --
轉義序列
\\ \自身
\$ 轉義$
\t 制表符
\b 退格符
\r 回車符
\n 換行符
\c 取消換行
常用系統變量?
PATH
PWD
LANG
HOME
HISTSIZE
PS1
IFS
域分隔符 是空格,換行,TAB鍵的合集
算術運算符
+
-
*
/
%
[root@MiWiFi-R3-srv ~]# echo $[3+1]
輸出結果:4
part2 關系操作
<?
>?
<=
>=
==
!=
&&
||
[root@MiWiFi-R3-srv ~]#?
[root@MiWiFi-R3-srv ~]# x=1
[root@MiWiFi-R3-srv ~]# [ $x -gt 1 ]
[root@MiWiFi-R3-srv ~]# echo $?
0
part3 賦值運算符
=
+=
*=
/=
%=
#!/bin/bash
var='/etc/init.d'
#var='/dev/sda'
if多分支
if (條件) 動作
若有多個動作,則要用大括號將動作體包含起來 if (條件) {動作1;動作2}
# awk -F: '{if ($1 == "root") print $1}' /etc/passwd
root
#?
# awk -F: '{if ($1 == "root") {print $1;print $6}}' /etc/passwd
root
/root
#
if (條件1)
動作1
else
動作2
# awk -F: '{if ($1 == "root"){print $1}else print $6}' /etc/passwd
# awk -F: '{if ($1 == "root") print $1;else print $6}' /etc/passwd
上面兩個命令是等價的,要么用分號隔開,表示第一個動作體的結束,要么將動作體用大括號定位范圍
if (條件 1)
動作1
else if(條件 2)
動作2
else if(條件 3)
動作3
else
動作4
# awk -F: '{if ($1 == "root") print $1;else if ($1 == "seker") print $6;else if ($1 == "zorro") print $7;else print NR}' /etc/passwd
root
2
3
...
33
/home/seker
/bin/bash
36
條件 ? 動作1 : 動作2
expr?action1:action2
# awk -F: 'var=($3 >= 500)?$1:"system_user" {print $1"\t"$3"\t"var}' /etc/passwd
# awk -F: '{print ($3>500?$1:$2)}' /etc/passwd
?
二:awk文本處理
打印uid在30~40范圍內的用戶名。
awk?-F:?'$3?>=30?&&??$3<=40?{print?$1}'?passwd?
打印第5-10行的行號和用戶名
awk?-F:?'NR>=5?&&?NR<=10{print?NR,$1}'?passwd?
打印奇數行
[root@python_lb?yan]#?awk?-F:?'{if(NR%2==1)?print?$0}'?passwd?
打印偶數行
[root@python_lb?yan]#awk?-F:?'{if(NR%2==0)?print?$0}'?passwd?
打印字段數大于5的行
[root@python_lb?yan]#?awk?-F:?'NF>5{print?$0}'?passwd?
打印UID不等于GID的用戶名
awk?-F:?'$3!=$4{print?$1}'?passwd?
打印沒有指定shell的用戶
? awk?-F:?'$7==""{print?$1}'?passwd?
三:shell腳本編寫
自動部署、初始配置、并啟動nginx反向代理服務
systemctl?stop?firewalld.service
setenforce?0?
sed?-i?'s#SELINUX=enforcing#SELINUX=disabled#g'?/etc/sysconfig/selinux?
iptables?-F
yum?install?-y?epel-release
yum?install?-y?nginx?
systemctl?start?nginx.service?
監控腳本:監控每臺機器的內存使用率>70%,則輸出報警信息
(思路提示:
[root@www?~]#?((80>70))
[root@www?~]#?echo?$?
0
)
#!/bin/bash
mem_total=`free?|awk?'NR==2{print?$2}'`
mem_userd=`free|awk?'NR==2{print?$3}'`
mem_per=`echo?"scale=2;${mem_userd}/${mem_total}"|bc?-l|cut?-d.?-f2`
if?[?$mem_per?-gt?70?]
then?
?????echo?"警報信息"
else
??????echo?"正常"
fi?
?
???????? )
?
?
轉載于:https://www.cnblogs.com/xuaijun/p/6605610.html
總結
以上是生活随笔為你收集整理的Shell awk文本处理,shell脚本编写的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP文件缓存实现
- 下一篇: web移动端开发经验总结