在我一開始工作中我經常在shell終端,查找一個文件內容。比如說查看k8s中的yaml文件的鏡像版本。又或者說通過docker ps 查看自己啓動的容器。kubectl get pod 查看部署的應用等等。如果內容過多的情況下,這是一個很糟心的查詢。
體驗一下:
- 查看運行的應用
[root@master ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1641d0104420 793aa6b7de27 "/usr/local/bin/do..." 46 minutes ago Up 46 minutes k8s_elasticsearch-logging_elasticsearch-logging-0_agree-logging_8600c2e0-6588-11e9-ae16-000c2988e069_0
605e9735d91d k8s.gcr.io/pause-amd64:3.1 "/pause" 46 minutes ago Up 46 minutes k8s_POD_elasticsearch-logging-0_agree-logging_8600c2e0-6588-11e9-ae16-000c2988e069_0
55080ec66e09 esrally:v1.0.4 "container-entrypo..." 50 minutes ago Up 50 minutes 8080/tcp modest_leavitt
1be756629849 b3b94275d97c "/coredns -conf /e..." 3 hours ago Up 3 hours k8s_coredns_coredns-78fcdf6894-hqrkf_kube-system_68a7e161-64d7-11e9-affc-000c2988e069_3
cd155a56c165 k8s.gcr.io/pause-amd64:3.1 "/pause" 3 hours ago Up 3 hours k8s_POD_coredns-78fcdf6894-hqrkf_kube-system_68a7e161-64d7-11e9-affc-000c2988e069_17
a36f0a38e88d f0fad859c909 "/opt/bin/flanneld..." 3 hours ago Up 3 hours k8s_kube-flannel_kube-flannel-ds-l4zvp_kube-system_c55f80b2-5cf7-11e9-b370-000c2988e069_8
b8e8e566bf85 k8s.gcr.io/pause-amd64:3.1 "/pause" 3 hours ago Up 3 hours k8s_POD_kube-flannel-ds-l4zvp_kube-system_c55f80b2-5cf7-11e9-b370-000c2988e069_8
9a3035bacf52 1d3d7afd77d1 "/usr/local/bin/ku..." 3 hours ago Up 3 hours k8s_kube-proxy_kube-proxy-vjvkk_kube-system_e42abfbb-1492-11e9-b6a9-000c2988e069_60
4d057f1fef0a k8s.gcr.io/pause-amd64:3.1 "/pause" 3 hours ago Up 3 hours k8s_POD_kube-proxy-vjvkk_kube-system_e42abfbb-1492-11e9-b6a9-000c2988e069_60
549095bfb29e 0e4a34a3b0e6 "kube-scheduler --..." 3 hours ago Up 3 hours k8s_kube-scheduler_kube-scheduler-master_kube-system_31eabaff7d89a40d8f7e05dfc971cdbd_93
388d41604238 b8df3b177be2 "etcd --advertise-..." 3 hours ago Up 3 hours k8s_etcd_etcd-master_kube-system_2cc1c8a24b68ab9b46bca47e153e74c6_73
801f7294fc62 214c48e87f58 "kube-apiserver --..." 3 hours ago Up 3 hours k8s_kube-apiserver_kube-apiserver-master_kube-system_bd829572688cd83df30d77573e20a841_7
5854c6b0a66b 55b70b420785 "kube-controller-m..." 3 hours ago Up 3 hours k8s_kube-controller-manager_kube-controller-manager-master_kube-system_ed22f179498ace780d8aa871521ae2eb_92
a63f448e83bd k8s.gcr.io/pause-amd64:3.1 "/pause" 3 hours ago Up 3 hours k8s_POD_kube-scheduler-master_kube-system_31eabaff7d89a40d8f7e05dfc971cdbd_67
e55a884153d8 k8s.gcr.io/pause-amd64:3.1 "/pause" 3 hours ago Up 3 hours k8s_POD_kube-controller-manager-master_kube-system_ed22f179498ace780d8aa871521ae2eb_66
08feb5fb645d k8s.gcr.io/pause-amd64:3.1 "/pause" 3 hours ago Up 3 hours k8s_POD_kube-apiserver-master_kube-system_bd829572688cd83df30d77573e20a841_6
b4e039304759 k8s.gcr.io/pause-amd64:3.1 "/pause" 3 hours ago Up 3 hours k8s_POD_etcd-master_kube-system_2cc1c8a24b68ab9b46bca47e153e74c6_67
72e81fe0101b docker.io/portainer/portainer "/portainer" 3 months ago Up 3 hours 0.0.0.0:9000->9000/tcp portainer
- 查看文件中某個配置
[root@master elasticsearch]# cat es-nodes.yaml
此處省略N行...
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
namespace: agree-logging
name: elasticsearch-logging
labels:
k8s-app: elasticsearch-logging
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
subjects:
- kind: ServiceAccount
name: elasticsearch-logging
namespace: agree-logging
apiGroup: ""
roleRef:
kind: ClusterRole
name: elasticsearch-logging
apiGroup: ""
---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: elasticsearch-logging
namespace: agree-logging
labels:
k8s-app: elasticsearch-logging
version: 6.2.4
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
spec:
serviceName: elasticsearch-logging
replicas: 1
selector:
matchLabels:
k8s-app: elasticsearch-logging
version: 6.2.4
template:
metadata:
labels:
k8s-app: elasticsearch-logging
version: 6.2.4
kubernetes.io/cluster-service: "true"
spec:
serviceAccountName: elasticsearch-logging
containers:
- image: 192.168.191.8:80/library/elasticsearch:v6.2.4
...此處省略100行 這裏是一個屏幕裝不下的內容
使用grep工具之後,感覺好用到飛呀
- 使用grep查看運行的應用
[root@master ~]# docker ps | grep portainer
72e81fe0101b docker.io/portainer/portainer "/portainer" 3 months ago Up 3 hours 0.0.0.0:9000->9000/tcp portainer
- 使用grep查看文件
[root@master elasticsearch]# grep 'image' es-nodes-ok.yaml
- image: 192.168.191.8:80/library/elasticsearch:v6.2.4
- image: 192.168.191.8:80/library/alpine:3.6
- image: 192.168.191.8:80/library/elasticsearch:v6.2.4
- image: 192.168.191.8:80/library/alpine:3.6
是不是有種瞬間豁然開朗的感覺
這次記錄的前序,有點長。。。當然學習過程中還會發現grep這個工具的更加強大的地方。此處留給你們去探索啦。
1. 正經八百的介紹
1. Linux grep工具 用於查找文件中符合條件的字符串。
至於 | 是管道符。作用是把前面的命令的輸出當做後面命令的條件。Linux的命令組合使用會產生更加強大的功能。是不是很神奇!
介紹一下grep常用的選下:
- -c 表示打印符合要求的行
- -i 表示忽略大小寫
- -n 表示輸出符合要求的行及行號
- -v 表示打印不符合要求的行
這幾個大寫字母后面都是要跟一個數字的(有無空格都可以),eg. -A2,-B2,-C2 以下解釋都用eg - -A 表示打印符合要求的行以及下面2行
- -B 表示打印符合要求的行以及上面2行
- -C 表示打印符合要求的行以及上下2行
本來介紹到這裏就應該做點練習,加強以下記憶啦。但是談grep,必談文本行處理的三劍客
—— grep、sed、awk
所以索性都學了吧,先介紹一下他們的用法。先後附上練習題。內功修爲
,還是得靠自己日復一日,年復一年的積累的。
2. Linux sed工具
grep命令還是不夠強大,它僅僅實現了對文本的查找功能。sed以及awk可以實現對文檔行的查找,替換並可以輸出到屏幕,而且還有更豐富的功能。sed和awk都是流式編輯器,是專門針對文檔行來操作的。
3. Linux awk工具
至於awk嘛,不學不知道。awk也是流式編輯器。針對文檔的行進行操作。但是它比sed工具要強大多了。awk工具使用起來更加的複雜。還有專門的書籍來介紹它的使用哩。對於我來說,目前只要夠用就行。以後需要了,在深入學習。
這是三劍客的練習題
三個工具使用的規則基本相同,大量使用正則表達式。因此注重介紹grep工具,awk以及sed附上練習題和答案
grep練習題
- 過濾出帶有某個關鍵字的行,並輸出行號
- 過濾出不帶有某個關鍵字的行,並輸出行號
- 過濾出所有包含數字的行
- 過濾出所有不包含數字的行
- 過濾所有以#開頭的行
- 過濾所有空行和以#開頭的行
- 過濾出任意一個字符和重複字符
- 指定要過濾的字符和出現的次數
- 過濾出一個或多個指定的字符
- 過濾出零個或一個指定的字符
- 過濾字符串1或者字符串2
sed工具練習題
- 把/etc/passwd複製到/root/test.txt, 用sed打印所有的行
- 打印test.txt的第3行~第10行
- 打印test.txt中包含root的行
- 刪除第15行以及後面的所有行
- 刪除包含bash的行
- 將test.txt中的root替換成toor
- 將test.txt中的/sbin/nologin替換成/bin/login
- 刪除第5行~第10行中所有的數字
- 刪除test.txt中所有特殊字符(除數字以及大小寫字母)
##sed練習題答案##
- cp /etc/passwd /root/test.txt
sed -n '1,$'p test.txt - sed -n '3,10’p test.txt
- sed -n '/root/'p test.txt
- sed '15,$'d test.txt
- sed '/bash/'d test.txt
- sed ‘s/root/toor/g’ test.txt
- sed ‘s#sbin/nologin#bin/login#g’ test.txt
- sed ‘5,10s/[0-9]//g’ test.txt
- sed ‘s/[^0-9a-zA-Z]//g’ test.txt
awk工具練習題
- 用awk打印整個test.txt(sed練習題中的test.txt)
- 查找包含bash的行
- 用:作爲分隔符查找第三個字段等於o的行
- 用:作爲分隔符,查找第一個字段爲root的行,並把root替換成toor
- 用:作爲分隔符,打印最後一個字段
- 打印行數大於20的所有行
- 用:作爲分隔符,打印所有第三字段小於第四字段的行
- 用:作爲分隔符,打印第一個字段以及最後一個字段,並且中間用@連接
- 用:作爲分隔符,把整個文檔的第四個字段相加,求和
##awk練習題答案##
- awk ‘{print $0}’ test.txt
- awk ‘/bash/’ test.txt
- awk -F’:’ ‘$3==“o”’ test.txt
- awk -F’:’ ‘$1==“root”’ test.txt | sed ‘s/root/toor/g’
- awk -F’:’ ‘{print $NF}’ test.txt
- awk -F’:’ ‘NR>20’ test.txt
- awk -F’:’ ‘$3<$4’ test.txt
- awk -F’:’ ’ {print NF}’ test.txt
- awk -F’:’ ‘{(sum+=$4)};END {print sum}’ test.txt
三個文本處理工具,還有很多功能。聯合起來,也能達到很強大的效果。需要我們在實踐中,一步一步摸索,發現他們更有意思的一面。未完待續……(主要是太困了,哈哈)