linux基礎(day30)

awk複習

awk 中使用外部shell變量

  • awk 中使用外部shell變量
A=44echo "ABCD" | awk -v GET_A=$A ’{print GET_A}’
說明:-v選項用於定義參數,這裏表示將變量A的值賦予GET_A。
有多少個變量須要賦值,就須要多少個-v選項。與之等價的:應用於腳本中:

#! /bin/bash
sort -n filename |awk -F ':' '{print $1}'|uniq >id.txt
for id in `cat id.txt`; do
        echo "[$id]"
        awk -v id2=$id -F ':' '$1==id2 {print $2}' filename  // 另外的方式爲: awk -F ':' '$1=="'id'" {print $2}' filename  
done
附件:
cat filename
1111111:13443253456
2222222:13211222122
1111111:13643543544
3333333:12341243123
2222222:12123123123

運行腳本後結果爲:
[1111111]
13443253456
13643543544
[2222222]
13211222122
12123123123
[3333333]
12341243123


思路:
先建立一個後綴爲 .sh 的文件,而後將內容,添加進入,並將其中failname改成你建立的 後綴爲 .sh 的文件
而後去執行shell文件——>sh 加 文件,便可看到結果

awk 合併一個文件

把一個文件多行鏈接成一行

awk中gsub函數的使用

  • awk 'gsub(/root/,"1111")' test.txt //把文件中全部的root替換爲1111
  • awk -F ':' 'gsub(/root/,"lll",$1) {print $0}' test.txt //把$1 中的root替換爲lll
    • 若這裏不加 -F ':' 指定分隔符,獲得的結果不一樣
[root@hf-01 awk]# awk 'gsub(/root/,"1111")' test.txt    //把文件中全部的root替換爲1111
1111x:0:0:1111:/1111:/bin/bash
operator:x:11:0:operator:/1111:/sbin/nologin
[root@hf-01 awk]# awk -F ':' 'gsub(/root/,"lll",$1) {print $0}' test.txt    //把$1 中的root替換爲lll
lllx 0 0 root /root /bin/bash

在不加-F ':' 指定分隔符,獲得的結果不一樣
[root@hf-01 awk]# awk 'gsub(/root/,"AAA",$1) {print $0}' test.txt
AAAx:0:0:AAA:/AAA:/bin/bash
operator:x:11:0:operator:/AAA:/sbin/nologin

awk 截取指定多個域爲一行

過濾兩個或多個關鍵詞

  • grep 或 egrep 或awk 過濾兩個或多個關鍵詞
grep -E '123|abc' filename  // 找出文件(filename)中包含123或者包含abc的行
egrep '123|abc' filename    //用egrep一樣能夠實現
awk '/123|abc/'  filename // awk 的實現方式

用awk生成如下結構文件

awk用print打印單引號

  • 方法一:html

  • head -3 |awk '{print "This is a '"'"'"$1}' test.txt //在前3行中,添加字符" This is a 'shell

    • 脫義的單引號字符 表達式爲 ' " ' " '
  • 方法二:bash

  • head -2 test.txt |awk '{print"11'''" $1}' //在前2行中,添加字符11 '函數

    • 脫義單引號字符表達式爲 " ' ' ' "
  • 添加雙引號字符this

  • head -2 test.txt |awk '{print"aaa"" $1}' //在前2行中,添加字符aaa "code

    • 脫義雙引號字符表達式爲 " " "
單引號
方法一:
[root@localhost ~]# head -3 |awk '{print "This is a '"'"'"$1}' test.txt    //在前3行中,添加字符" This is a '
This is a 'root:x:0:0:root:/root:/bin/bash
This is a '&&&
This is a 'as***fsdf****

方法二
[root@localhost ~]# head -2 test.txt |awk '{print"11'\''" $1}'    //在前2行中,添加字符11 '
11'root:x:0:0:root:/root:/bin/bash
11'&&&

雙引號
[root@localhost ~]# head -2 test.txt |awk '{print"aaa\"" $1}'    //在前2行中,添加字符aaa "
aaa"root:x:0:0:root:/root:/bin/bash
aaa"&&&

sed中添加單引號 '

  • head -2 test.txt|sed 's/(.*)/this '"'"'&/'g //在前2行中,添加字符11 '
    • 脫義單引號字符爲 ' " ' " '
[root@localhost ~]# head -2 test.txt|sed 's/\(.*\)/11 '"'"'&/'g
11 'root:x:0:0:root:/root:/bin/bash
11 '&&&

總結

  • 在awk中脫義單引號字符有兩種方法
      1. 脫義的單引號字符 表達式爲 ' " ' " '
      1. 脫義單引號字符表達式爲 " ' ' ' "
  • 在awk中脫義雙引號字符方法
    • 脫義雙引號字符表達式爲 " " "

合併兩個文件

  • paste 命令,將多個文件按照列隊列進行合併
    • 格式:paste filename1 filename2 //將兩個文件中相同的行合併到一行
    • -d 在兩個文件鏈接處用一個 指定的字符 鏈接
  • paste 2.txt 3.txt //將2和3文件中相同的行合併到一行
[root@hf-01 ~]# cat 2.txt
a v c
1 f g
as 4 5a
dd && a.
1 2
[root@hf-01 ~]# cat 3.txt
aa a 6
13 f45
1 f fg 
abc 6a2 asf 4fa
cda
abc
1
[root@hf-01 ~]# paste 2.txt 3.txt    //將2和3文件中相同的行合併到一行
a v c	aa a 6
1 f g	13 f45
as 4 5a	1 f fg 
dd && a.	abc 6a2 asf 4fa
1 2	cda
	abc
	1
[root@hf-01 ~]# paste -d '+' 2.txt 3.txt    //把文件2和3合併到一行中,並用+ 號字符鏈接
a v c+aa a 6
1 f g+13 f45
as 4 5a+1 f fg 
dd && a.+abc 6a2 asf 4fa
1 2+cda
+abc
+1
[root@hf-01 ~]#

awk的參考教程

相關文章
相關標籤/搜索