1. 程式人生 > >文字處理及檔案查詢

文字處理及檔案查詢


title: 文字處理及檔案查詢
date: 2018-10-14 18:18:18
tags:

  • VIM
  • Find
  • Sed
  • 正則表示式
  • shell指令碼

文字處理及正則表示式

檔案檢視

檔案檢視命令:
cat,tac,rev
cat [OPTION]… [FILE]…
-E:顯示行結束符$
-n:對顯示出的每一行進行編號
-A:顯示所有控制符
-b:非空行編號
-s:壓縮連續的空行成一行
tac
rev
檔案檢視
more: 分頁檢視檔案
more [OPTIONS…] FILE…
-d: 顯示翻頁及退出提示
less:一頁一頁地檢視檔案或STDIN輸出
檢視時有用的命令包括:
/文字搜尋文字
n/N跳到下一個或上一個匹配
less命令是man命令使用的分頁器

顯示文字前或後行內容*********************************************

head [OPTION]… [FILE]…
-c #: 指定獲取前#位元組
-n #: 指定獲取前#行
-#:指定行數
tail [OPTION]… [FILE]…
-c #: 指定獲取後#位元組
-n #: 指定獲取後#行
-#:同上
-f: 跟蹤顯示檔案fd新追加的內容,常用日誌監控
相當於–follow=descriptor
-F: 跟蹤檔名,相當於–follow=name --retry
tailf類似tail –f,當檔案不增長時並不訪問檔案
###按列抽取文字cut和合並檔案paste***************************************CUT
cut [OPTION]… [FILE]…
-d DELIMITER: 指明分隔符,預設tab
-f FILEDS:
…#: 第#個欄位
…#,#[,#]:離散的多個欄位,例如1,3,6
…#-#:連續的多個欄位, 例如1-6
混合使用:1-3,7
-c按字元切割
–output-delimiter=STRING指定輸出分隔符
cut和paste
顯示檔案或STDIN資料的指定列
cut-d:-f1/etc/passwd
cat /etc/passwd|cut-d:-f7
cut-c2-5/usr/share/dict/words
paste 合併兩個檔案同行號的列到一行
paste [OPTION]… [FILE]…
-d 分隔符:指定分隔符,預設用TAB
-s : 所有行合成一行顯示
示例:
paste f1 f2
paste -s f1 f2

收集文字統計資料wc*****************************************WC

計數單詞總數、行總數、位元組總數和字元總數
可以對檔案或STDIN中的資料執行
wcstory.txt
392371901story.txt
行數字數字節數
常用選項

-l只計數行數
-w只計數單詞總數
-c只計數字節總數
-m只計數字符總數
-L顯示檔案中最長行的長度

文字排序sort

把整理過的文字顯示在STDOUT,不改變原始檔案
sort[options]file(s)
常用選項

-r執行反方向(由上至下)整理
-R隨機排序
-n執行按數字大小整理
-f選項忽略(fold)字串中的字元大小寫
-u選項(獨特,unique)刪除輸出中的重複行
-t c選項使用c做為欄位界定符
-k X選項按照使用c字元分隔的X列來整理能夠使用多次

uniq

uniq命令:從輸入中刪除前後相接的重複的行
uniq[OPTION]… [FILE]…
-c: 顯示每行重複出現的次數
-d: 僅顯示重複過的行
-u: 僅顯示不曾重複的行
注:連續且完全相同方為重複
常和sort 命令一起配合使用:
sort userlist.txt | uniq-c

比較檔案

比較兩個檔案之間的區別
difffoo.conffoo2.conf
5c5
< use_widgets=no
.>use_widgets=yes
註明第5行有區別(改變)

取出IP地址的幾種方法: *************************************(重點)

ifconfig | sed -r ‘2!d;s/.inet (addr:)?//;s/ .//’ 6和7通用的取出IP地址
ifconfig eth0 | head -2|tail -1| tr -dc '[0-9]. ’ |tr -s ’ ’ |cut -d" " -f2 6系統上
ifconfig eth0|sed -n ‘2p’|sed ‘[email protected]inet @@’|sed ‘[email protected] [email protected]@’ 提取出7上的IP地址,其中@@為分隔符
ifconfig ens33|sed -nr '2s/.t (.) net.
/\1/gp’ 擴充套件的正則表示式取出IP,()為分組,只有一個括號,所以後面寫1
ifconfig ens33|sed -nr '2s/(.t) (.)( net.)/\2/gp’ 擴充套件的正則表示式取出IP,()為分組,有三個括號,所以後面寫2留第二個
ifconfig | sed -nr "s/.inet (.
) netmask./\1/p" | head -n 1 取出7的IP
ifconfig | sed -nr "s/.inet (.
) netmask.*/\1/p" 取出7的三個網絡卡IP

查詢系統資訊 ***********************************************重點

…#RED is content color
…#依次顯示出
…#系統版本
…#核心版本
…#CPU型號
…#記憶體大小
…#最大磁碟利用率
…#hostname
…#IP地址

RED="\033[1;31m"
COLOREND="\033[0m"
echo -e “OS version is R E D c a t / e t c / c e n t o s r e l e a s e RED`cat /etc/centos-release` COLOREND”
echo -e “kernel version R E D u n a m e r RED`uname -r` COLOREND”
echo -e “The cpu type is KaTeX parse error: Double superscript at position 42: … name'|tr -s ' '̲|cut -d: -f2`COLOREND”
echo -e “The memory is KaTeX parse error: Double superscript at position 31: …ep Mem|tr -s ' '̲ ':' |cut -d: -…COLOREND”
echo -e “The max disk used is R E D d f g r e p / d e v / s d t r s &quot; &quot; &quot; : &quot; c u t d : f 5 s o r t n r h e a d 1 RED`df |grep /dev/sd|tr -s &quot; &quot; &quot;:&quot;|cut -d: -f5|sort -nr|head -1` COLOREND”
echo -e “The hostname is R E D RED (hostname)$COLOREND”
echo -e “The ipaddr is R E D i f c o n f i g h e a d 2 t a i l 1 t r s &quot; &quot; &quot; : &quot; c u t d : f 3 RED`ifconfig|head -2|tail -1|tr -s &quot; &quot; &quot;:&quot;|cut -d: -f3` COLOREND”
unset RED COLOREND

Linux文字處理三劍客

grep:文字過濾(模式:pattern)工具
grep, egrep, fgrep(不支援正則表示式搜尋)
sed:stream editor,文字編輯工具
awk:Linux上的實現gawk,文字報告生成器

grep*************************************************(重點)

grep: Global search REgularexpression and Print out the line
作用:文字搜尋工具,根據使用者指定的“模式”對目標文字逐行進行匹配檢查;列印匹配到的行
模式:由正則表示式字元及文字字元所編寫的過濾條件

grep [OPTIONS] PATTERN [FILE…]
grep root /etc/passwd
grep " U S E R &quot; / e t c / p a s s w d g r e p USER&quot; /etc/passwd grep &#x27; USER’ /etc/passwd
grep whoami /etc/passwd
grep命令選項
–color=auto: 對匹配到的文字著色顯示
-v: 顯示不被pattern匹配到的行
-i: 忽略字元大小寫
-n:顯示匹配的行號
-c: 統計匹配的行數
-o: 僅顯示匹配到的字串
-q: 靜默模式,不輸出任何資訊
-A #: after, 後#行
-B #: before, 前#行
-C #:context, 前後各#行
-e:實現多個選項間的邏輯or關係
grep –e ‘cat ’ -e ‘dog’ file
-w:匹配整個單詞
-E:使用ERE
-F:相當於fgrep,不支援正則表示式
-ffile: 根據模式檔案處理

正則表示式*************************************重點

REGEXP:Regular Expressions,由一類特殊字元及文字字元所編寫的模式,其中有些字元(元字元)不表示字元字面意義,而表示控制或通配的功能
程式支援:grep,sed,awk,vim, less,nginx,varnish等
分兩類:
基本正則表示式:BRE
擴充套件正則表示式:ERE
grep -E, egrep
正則表示式引擎:
採用不同演算法,檢查處理正則表示式的軟體模組
PCRE(Perl Compatible Regular Expressions)
元字元分類:字元匹配、匹配次數、位置錨定、分組
man 7 regex

基本正則表示式元字元

字元匹配:
. 匹配任意單個字元
[] 匹配指定範圍內的任意單個字元,示例:[wang] [0-9] [a-z] [a-zA-Z]
[^] 匹配指定範圍外的任意單個字元
[:alnum:] 字母和數字
[:alpha:] 代表任何英文大小寫字元,亦即A-Z, a-z
[:lower:] 小寫字母[:upper:] 大寫字母
[:blank:] 空白字元(空格和製表符)
[:space:]水平和垂直的空白字元(比[:blank:]包含的範圍廣)
[:cntrl:] 不可列印的控制字元(退格、刪除、警鈴…)
[:digit:] 十進位制數字[:xdigit:]十六進位制數字
[:graph:] 可列印的非空白字元
[:print:] 可列印字元
[:punct:] 標點符號

萬用字元是通配的檔名

正則表示式是配的字串,檔案的內容
【wang】 匹配這四個字元其中的一個
grep “[123]” /etc/passwd查詢passwd資料夾裡包含123中一個數字的檔案
grep -v “[123]” /etc/passwd查詢passwd資料夾裡不包含123中一個數字的檔案
grep “[^123]” /etc/passwd查詢passwd資料夾裡除了123中一個數字的檔案
匹配次數:用在要指定次數的字元後面,用於指定前面的字元要出現的次數
‘* 匹配前面的字元任意次,包括0次
貪婪模式:儘可能長的匹配
.*任意長度的任意字元
?匹配其前面的字元0或1次
+匹配其前面的字元至少1次
{n}匹配前面的字元n次
{m,n}匹配前面的字元至少m次,至多n次
{,n}匹配前面的字元至多n次
{n,}匹配前面的字元至少n次

位置錨定:定位出現的位置

^ 行首錨定,用於模式的最左側 grep “^bash” /etc/passwd
$ 行尾錨定,用於模式的最右側 grep "bash &quot; / e t c / p a s s w d P A T T E R N &quot; /etc/passwd ^PATTERN 用於模式匹配整行
^$ 空行
1$ 空白行
< 或\b詞首錨定,用於單詞模式的左側(單詞不能包含數字、_、其他字母開頭)
> 或\b詞尾錨定,用於單詞模式的右側
<PATTERN>匹配整個單詞
**************************************************

正則表示式

分組:() 將一個或多個字元捆綁在一起,當作一個整體處理,如:(root)+
分組括號中的模式匹配到的內容會被正則表示式引擎記錄於內部的變數中,這些變數的命名方式為: \1, \2, \3, …
\1表示從左側起第一個左括號以及與之匹配右括號之間的模式所匹配到的字元
示例:(string1+(string2))
\1 :string1+(string2)

\2 :string2
後向引用:引用前面的分組括號中的模式所匹配字元,而非模式本身
或者:|
示例:a|b: a或b C|cat: C或cat (C|c)at:Cat或cat
元字元

^ 行首
$行尾
.任意單一字元
[][]內任意單一字元
[^]除[]內任意單一字元
**前面字元重複不確定次數
++前面字元重複一次以上不確定次數
??前面字元重複0或1次
\轉義符
.*任意長度字元
{n}前面字元重複n次
{n,}前面字元重複n次以上
{m,n}前面字元重複m次和n次之間
[:alnum:]字母和數字
[:alpha:]代表任何英文大小寫字元,亦即A-Z, a-z
[:lower:]小寫字母
[:upper:]大寫字母
[:blank:]水平空白字元(空格和製表符)
[:space:]所有水平和垂直的空白字元(比[:blank:]包含的範圍廣)
[:cntrl:]不可列印的控制字元(退格、刪除、警鈴…)
[:digit:]十進位制數字
[:graph:]可列印的非空白字元
[:print:]可列印字元
[:punct:]標點符號
[:xdigit:]十六進位制數字

egrep及擴充套件的正則表示式

egrep= grep -E
egrep[OPTIONS] PATTERN [FILE…]
擴充套件正則表示式的元字元:
字元匹配:
. 任意單個字元
[] 指定範圍的字元
[^] 不在指定範圍的字元
次數匹配:
*匹配前面字元任意次
?0或1次
+1次或多次
{m}匹配m次
{m,n}至少m,至多n次
位置錨定:
^行首
$行尾
<, \b語首
>, \b語尾
分組:()
後向引用:\1, \2, …
或者:
a|ba或b
C|catC或cat
(C|c)atCat或cat

vim簡介*************************************重點

見PDF6中第32,68,69頁圖片
vi: Visual Interface,文字編輯器
文字:ASCII, Unicode
文字編輯種類:
行編輯器: sed
全屏編輯器:nano, vi
vim-Vi Improved
其他編輯器:
gedit一個簡單的圖形編輯器
gvim一個Vim編輯器的圖形版本

開啟檔案

vim [OPTION]… FILE…
+#開啟檔案後,讓游標處於第#行的行首,+預設行尾
+/PATTERN開啟檔案後,直接讓游標處於第一個被PATTERN匹配到的行的行首
–b file 二進位制方式開啟檔案
–d file1 file2… 比較多個檔案
-m file 只讀開啟檔案
ex file 或vim –e 直接進入ex模式
如果該檔案存在,檔案被開啟並顯示內容
如果該檔案不存在,當編輯後第一次存檔時建立它
模式轉換
命令模式–> 插入模式
iinsert, 在游標所在處輸入
I在當前游標所在行的行首輸入
aappend, 在游標所在處後面輸入
A在當前游標所在行的行尾輸入
o在當前游標所在行的下方開啟一個新行
O在當前游標所在行的上方開啟一個新行


插入模式--------> 命令模式
ESC
命令模式--------> 擴充套件命令模式
:
擴充套件命令模式--------> 命令模式
ESC,enter


擴充套件命令模式:
:q退出
:q!強制退出,丟棄做出的修改
:wq儲存退出
:x儲存退出
命令模式
ZZ儲存退出
ZQ不儲存退出
命令模式游標跳轉
字元間跳轉:
h: 左l: 右j: 下k: 上
.#COMMAND:跳轉由#指定的個數的字元******************

單詞間跳轉:

w:下一個單詞的詞首
e:當前或下一單詞的詞尾
b:當前或前一個單詞的詞首
。#COMMAND:由#指定一次跳轉的單詞數
當前頁跳轉:
H:頁首M:頁中間行L:頁底
zt:將游標所在當前行移到螢幕頂端
zz:將游標所在當前行移到螢幕中間
zb:將游標所在當前行移到螢幕底端
行首行尾跳轉:
^: 跳轉至行首的第一個非空白字元
0: 跳轉至行首
$: 跳轉至行尾
行間移動:
.#G、擴充套件命令模式下:# 跳轉至由#指定行
G:最後一行
1G, gg: 第一行
句間移動:
):下一句(:上一句
段落間移動:
}:下一段{:上一段
命令模式翻屏操作
Ctrl+f: 向檔案尾部翻一屏
Ctrl+b: 向檔案首部翻一屏
Ctrl+d: 向檔案尾部翻半屏
Ctrl+u:向檔案首部翻半屏

命令模式操作**********************************************重點

刪除命令:
d: 刪除命令,可結合游標跳轉字元,實現範圍刪除
d$: 刪除到行尾
d^:刪除到非空行首
d0:刪除到行首
dw:
de:
db:
.#COMMAND
dd: 刪除游標所在的行
.#dd:多行刪除
D:從當前游標位置一直刪除到行尾,等同於d$
複製命令(y, yank):
y: 複製,行為相似於d命令
y$
y0
y^
ye
yw
yb
.#COMMAND
yy:複製行
.#yy: 複製多行
Y: 複製整行

命令模式

di" 游標在”“之間,則刪除”“之間的內容
yi( 游標在()之間,則複製()之間的內容
vi[ 游標在[]之間,則選中[]之間的內容
dtx刪除字元直到遇見游標之後的第一個x 字元
ytx複製字元直到遇見游標之後的第一個x 字元
擴充套件命令模式:地址定界********************按ESC進入命令模式,再按:進入擴充套件命令模式

地址定界

:start_pos,end_pos
# 具體第#行,例如2表示第2行#,# 從左側#表示起始行,到右側#表示結尾行
#,+# 從左側#表示的起始行,加上右側#表示的行數 :2,+3 表示2到5行 . 當前行 . , ` 最後一行 .,` `-1 當前行到倒數第二行
% 全文, 相當於1,$
/pat1/,/pat2/
從第一次被pat1模式匹配到的行開始,一直到第一次被pat2匹配到的行結束
#,/pat/
/pat/,$
使用方式:後跟一個編輯命令
d
y
w file: 將範圍內的行另存至指定檔案中
r file:在指定位置插入指定檔案中的所有內容
/PATTERN:從當前游標所在處向檔案尾部查詢
?PATTERN:從當前游標所在處向檔案首部查詢
n:與命令同方向
N:與命令反方向


s: 在擴充套件模式下完成查詢替換操作************************************重點

格式:s/要查詢的內容/替換為的內容/修飾符
要查詢的內容:可使用模式
替換為的內容:不能使用模式,但可以使用\1, \2, …等後向引用符號;還可以使用“&”引用前面查詢時查詢到的整個內容
修飾符:
i: 忽略大小寫
g: 全域性替換;預設情況下,每一行只替換第一次出現
gc:全域性替換,每次替換前詢問
查詢替換中的分隔符/可替換為其它字元,例如
[email protected]/[email protected]/[email protected]
s#/boot#/#i


命令模式:撤消更改
u撤銷最近的更改
#u撤銷之前多次更改
U撤消游標落在這行後所有此行的更改
按Ctrl-r重做最後的“撤消”更改
. 重複前一個操作
n.重複前一個操作n次
多檔案模式
vim FILE1 FILE2 FILE3 …
:next 下一個
:prev前一個
:first 第一個
:last 最後一個
:wall 儲存所有
:qall退出所有
:wqall


定製vim的工作特性

配置檔案:永久有效
全域性:/etc/vimrc***********************
個人:~/.vimrc
擴充套件模式:當前vim程序有效
(1) 行號
顯示:set number, 簡寫為set nu
取消顯示:set nonumber, 簡寫為set nonu
(2) 忽略字元的大小寫
啟用:set ic
不忽略:set noic
(3) 自動縮排
啟用:set ai
禁用:set noai
(4) 智慧縮排
啟用:smartindent簡寫set si
禁用:set nosi
(5) 高亮搜尋
啟用:set hlsearch
禁用:set nohlsearch
(6) 語法高亮
啟用:syntax on
禁用:syntax off
(7) 顯示Tab和換行符^I 和$顯示
啟用:set list
禁用:set nolist
(8) 檔案格式
啟用windows格式:set fileformat=dos
啟用unix格式:set fileformat=unix
簡寫:set ff=dos|unix
(9) 設定文字寬度
set textwidth=65 (vimonly)
set wrapmargin=15
(10) 設定游標所在行的標識線
啟用:set cursorline,簡寫cul
禁用:set no cursorline
(11) 複製保留格式
啟用:set paste
禁用:set nopaste


SHELL指令碼*********************************************重點

建立shell指令碼
第一步:使用文字編輯器來建立文字檔案
第一行必須包括shell宣告序列:#!
.#!/bin/bash
添加註釋
註釋以#開頭
第二步:執行指令碼
給予執行許可權,在命令列上指定指令碼的絕對或相對路徑
直接執行直譯器,將指令碼作為直譯器程式的引數執行
指令碼規範
指令碼程式碼開頭約定
1、第一行一般為呼叫使用的語言
2、程式名,避免更改檔名為無法找到正確的檔案
3、版本號
4、更改後的時間
5、作者相關資訊
6、該程式的作用,及注意事項
7、最後是各版本的更新簡要說明
shell指令碼示例
#!/bin/bash
#------------------------------------------
#Filename: hello.sh
#Revision: 1.1
#Date: 2017/06/01
#Author: wang
#Email: [email protected]
#Website: www.magedu.com
#Description: This is the first script
#------------------------------------------
#Copyright: 2017 wang
#License: GPL
echo “hello world”


.vimrc檔案在根目錄下,修改:vim .vimrc 檔案
可以修改vim的指令碼註釋作者等資訊*******************************************


區域性變數

變數賦值:name=‘value’
可以使用引用value:
(1) 可以是直接字串; name=“root”
(2) 變數引用:name="$USER"

(3) 命令引用:name=COMMAND name= ( C O M M A N D ) (COMMAND) 變數引用: {name} $name
“”:弱引用,其中的變數引用會被替換為變數值

‘’:強引用,其中的變數引用不會被替換為變數值,而保持原字串
顯示已定義的所有變數:set
刪除變數:unset name
環境變數
變數宣告、賦值:
export name=VALUE
declare -x name=VALUE
變數引用:$name, ${name}
顯示所有環境變數:
env

printenv
export
declare -x
刪除變數:
unset name
退出狀態
程序使用退出狀態來報告成功或失敗
0 代表成功,1-255代表失敗
$? 變數儲存最近的命令退出狀態
例如:
ping-c1-W1hostdown&>/dev/null
echo$?


退出狀態碼***********************************************************8

bash自定義退出狀態碼
exit [n]:自定義退出狀態碼
注意:指令碼中一旦遇到exit命令,指令碼會立即終止;終止退出狀態取決於exit命令後面的數字
注意:如果未給指令碼指定退出狀態碼,整個指令碼的退出狀態碼取決於指令碼中執行的最後一條命令的狀態碼

算術運算

bash中的算術運算:help let
+, -, , /, %取模(取餘), (乘方)
實現算術運算:
(1) let var=算術表示式
(2) var= [ ] ( 3 ) v a r = [算術表示式] (3) var= ((算術表示式))
(4) var= ( e x p r a r g 1 a r g 2 a r g 3... ) ( 5 ) d e c l a r e i v a r = ( 6 ) e c h o b c b a s h (expr arg1 arg2 arg3 ...) (5) declare –ivar= 數值 (6) echo ‘算術表示式’ | bc 乘法符號有些場景中需要轉義,如* bash有內建的隨機數生成器: RANDOM(0-32767)
echo [ [ RANDOM%50] :0-49之間隨機數
增強型賦值:
+=, -=, =, /=, %=
let varOPERvalue
例如:let count+=3
自加3後自賦值
自增,自減:
例子:
let var+=1
let var++
let var-=1
let var–
let n=1+2
echo n 3 n = n 3 n= (2+3)
2
expr 3+4 錯誤
expr 3 + 4
7
expr為命令 3+4為引數之間要有空格
********************************
echo $[RANDOM%100+1] 取1-100之間的隨機數 **
RANDOM為隨機數,除以100得到的餘數為0-99,+1後為1-100 *****
echo $? 查詢命令執行結果


& 與 交集****************************************************
| 或 並集
! 非
^ 異或 相同為0 不同為1
&& 短路與 兩條命令,第一條為真,則執行第二天2條看真假,第一條為假的情況下直接不執行命令
|| 短路或 兩條命令,第一條為假,則執行第二天2條看真假,第一條為真的情況下直接不執行命令
同或 相同為1 不同為0
[ “ s t r 1 &quot; ! = &quot; str1&quot; !=&quot; str2” ] 判斷兩個字串是否相同
bash +x 加sh指令碼可以看到指令碼執行的過程,可以檢查哪裡出錯
export +定義的變數可使該變數在子程序中也生效
find -name +檔名 查詢檔案或者安裝包


bash的數值測試

-v VAR
變數VAR是否設定
數值測試:
-gt是否大於
-ge是否大於等於
-eq是否等於
-ne是否不等於
-lt是否小於
-le是否小於等於
Bash的檔案屬性測試

檔案大小測試:

-s FILE: 是否存在且非空
檔案是否開啟:
-t fd: fd檔案描述符是否在某終端已經開啟
-N FILE:檔案自從上一次被讀取之後是否被修改過
-O FILE:當前有效使用者是否為檔案屬主
-G FILE:當前有效使用者是否為檔案屬組
Bash的檔案測試

存在性測試

-a FILE:同-e
-e FILE: 檔案存在性測試,存在為真,否則為假
存在性及類別測試
-b FILE:是否存在且為塊裝置檔案
-c FILE:是否存在且為字元裝置檔案
-d FILE:是否存在且為目錄檔案
-f FILE:是否