linux 從grep工具到文本行處理三劍客grep、sed、awk

在我一開始工作中我經常在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. 過濾出不帶有某個關鍵字的行,並輸出行號
  3. 過濾出所有包含數字的行
  4. 過濾出所有不包含數字的行
  5. 過濾所有以#開頭的行
  6. 過濾所有空行和以#開頭的行
  7. 過濾出任意一個字符和重複字符
  8. 指定要過濾的字符和出現的次數
  9. 過濾出一個或多個指定的字符
  10. 過濾出零個或一個指定的字符
  11. 過濾字符串1或者字符串2

sed工具練習題

  1. 把/etc/passwd複製到/root/test.txt, 用sed打印所有的行
  2. 打印test.txt的第3行~第10行
  3. 打印test.txt中包含root的行
  4. 刪除第15行以及後面的所有行
  5. 刪除包含bash的行
  6. 將test.txt中的root替換成toor
  7. 將test.txt中的/sbin/nologin替換成/bin/login
  8. 刪除第5行~第10行中所有的數字
  9. 刪除test.txt中所有特殊字符(除數字以及大小寫字母)

##sed練習題答案##

  1. cp /etc/passwd /root/test.txt
    sed -n '1,$'p test.txt
  2. sed -n '3,10’p test.txt
  3. sed -n '/root/'p test.txt
  4. sed '15,$'d test.txt
  5. sed '/bash/'d test.txt
  6. sed ‘s/root/toor/g’ test.txt
  7. sed ‘s#sbin/nologin#bin/login#g’ test.txt
  8. sed ‘5,10s/[0-9]//g’ test.txt
  9. sed ‘s/[^0-9a-zA-Z]//g’ test.txt

awk工具練習題

  1. 用awk打印整個test.txt(sed練習題中的test.txt)
  2. 查找包含bash的行
  3. 用:作爲分隔符查找第三個字段等於o的行
  4. 用:作爲分隔符,查找第一個字段爲root的行,並把root替換成toor
  5. 用:作爲分隔符,打印最後一個字段
  6. 打印行數大於20的所有行
  7. 用:作爲分隔符,打印所有第三字段小於第四字段的行
  8. 用:作爲分隔符,打印第一個字段以及最後一個字段,並且中間用@連接
  9. 用:作爲分隔符,把整個文檔的第四個字段相加,求和

##awk練習題答案##

  1. awk ‘{print $0}’ test.txt
  2. awk ‘/bash/’ test.txt
  3. awk -F’:’ ‘$3==“o”’ test.txt
  4. awk -F’:’ ‘$1==“root”’ test.txt | sed ‘s/root/toor/g’
  5. awk -F’:’ ‘{print $NF}’ test.txt
  6. awk -F’:’ ‘NR>20’ test.txt
  7. awk -F’:’ ‘$3<$4’ test.txt
  8. awk -F’:’ ’ {print 1&quot;@&quot;1&quot;@&quot;NF}’ test.txt
  9. awk -F’:’ ‘{(sum+=$4)};END {print sum}’ test.txt

三個文本處理工具,還有很多功能。聯合起來,也能達到很強大的效果。需要我們在實踐中,一步一步摸索,發現他們更有意思的一面。未完待續……(主要是太困了,哈哈)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章