Linux 下進(jìn)行字符串操作最常用的三個(gè)命令:
-
awk
(檢索) -
sed
(編輯) -
grep
(匹配)
awk
語(yǔ)法:
$ awk [-F fs] [-v var=value] [-f progfile | 'prog'] [file ...]
代碼結(jié)構(gòu):
BEGIN { FS=":"; RS=";" } # 可選
{ print 'Processing: ' $1 } # 必選
END { print 'End: ' } # 可選
設(shè)置變量:
$ awk -v a='hello' -v b='world' 'BEGIN {print a ", " b}'
hello, world
指定字段分隔符:
$ echo "1:2:3" | awk -F: '{ print $1 "-" $2 "-" $3 }'
$ echo "1:2:3" | awk -v FS=':' '{ print $1 "-" $2 "-" $3 }'
$ echo "1:2:3" | awk 'BEGIN { FS=":" } { print $1 "-" $2 "-" $3 }'
1-2-3
指定過(guò)濾條件:
# 行匹配(/reg/)
$ awk -F: '/^r/ {print $0}' /etc/passwd
# 列匹配($k ~ /reg/)
$ awk -F: '$1 ~ /^r/ {print $0}' /etc/passwd
輸出控制:
# 所有列
$ awk -F: '/^r/ {print $0}' /etc/passwd
# 第 k 列
$ awk -F: '/^r/ {print $1}' /etc/passwd
# 最后一列
$ awk -F: '/^r/ {print $NF}' /etc/passwd
# 倒數(shù)第 k 列
$ awk -F: '/^r/ {print $(NF-1)}' /etc/passwd
# 編號(hào)
$ awk -F: '/^r/ {print FNR $0}' /etc/passwd
sed
語(yǔ)法:
$ sed [-nefi] '[begin , end] s/regex/complex/'
替換:
# 每行第一次匹配
$ sed 's/r/R/' /etc/passwd
# 每行所有匹配
$ sed 's/r/R/g' /etc/passwd
# 多組替換
$ sed 's/r/R/; s/o/O/' /etc/passwd
$ sed -e 's/r/R/' -e 's/o/O/' /etc/passwd
插入:
$ sed '1a BOF' file.txt
$ sed '$a EOF' file.txt
刪除:
$ sed '5, $d' /etc/passwd
$ sed '/^root/d' /etc/passwd
輸出控制:
# 輸出第 5 - 10 行
$ sed '5, 10' /etc/passwd
# 輸出第 5 - EOF 行
$ sed '5, $' /etc/passwd
# 只顯示被編輯的行
$ sed -n 's/r/R/p' /etc/passwd
直接修改文件:
$ sed -i 's/hello/HELLO/' hello.txt
<h2 id="grep">grep</h2>
語(yǔ)法:
$ grep 'pattern' [file ...]
綜上
查找文件內(nèi)容:
$ awk '/^root/ {print $0}' /etc/passwd # $0 或 {...} 都可以省略
$ sed -n '/^root/p' /etc/passwd
$ grep '^root' /etc/passwd
提取 IP 地址:
$ ifconfig en0 | awk '/inet / {print $2}'