第三周筆記

Linux的文本處理三劍客
> grep:文本過濾(模式:pattern)工具
> grep, egrep, fgrep(不支持正則表達式搜索)
> sed:stream editor,文本編輯工具
> awk:Linux上的實現gawk,文本報告生成器
– ### grep
作用是根據“pattern”對目標文件進行搜索,并且顯示匹配到的行

這就是一個簡單的腳本腳本的用途是顯示hello
grep分三種
> 1:fgerp不支持正則表達式,但是搜索速度極快
> 2:gerp支持正則表達式
> 3:egerp支持擴展的正則表達式 有
用法:grep [OPTIONS] PATTERN [FILE…]
gerp常用的選項
-color=auto: 對匹配到的文本著色顯示
-v: 顯示不被pattern匹配到的行
-i: 忽略字符大小寫
-n:顯示匹配的行號
-c: 統計匹配的行數
-o: 僅顯示匹配到的字符串
-q: 靜默模式,不輸出任何信息
-A #: after, 后#行
-B #: before, 前#行
-C #:context, 前后各#行
-e:實現多個選項間的邏輯or關系
-w:匹配整個單詞
-E:使用ERE
-F:相當于fgrep,不支持正則表達式

正則表達式的元字符有

“`
. 匹配任意單個字符
[] 匹配指定范圍內的任意單個字符
[^] 匹配指定范圍外的任意單個字符
[:alnum:] 字母和數字
[:alpha:] 代表任何英文大小寫字符,亦即 A-Z, a-z
[:lower:] 小寫字母 [:upper:] 大寫字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范圍廣)
[:cntrl:] 不可打印的控制字符(退格、刪除、警鈴…)
[:digit:] 十進制數字 [:xdigit:]十六進制數字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 標點符號
“`
匹配次數有
“`
* 匹配前面的字符任意次,包括0次
貪婪模式:盡可能長的匹配
.* 任意長度的任意字符
\? 匹配其前面的字符0或1次
\+ 匹配其前面的字符至少1次
\{n\} 匹配前面的字符n次
\{m,n\} 匹配前面的字符至少m次,至多n次
\{,n\} 匹配前面的字符至多n次
\{n,\} 匹配前面的字符至少n次
“`
位置錨定的字符有

“`
位置錨定:定位出現的位置
^ 行首錨定,用于模式的最左側
$ 行尾錨定,用于模式的最右側
^PATTERN$ 用于模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行
\< 或 \b 詞首錨定,用于單詞模式的左側
\> 或 \b 詞尾錨定;用于單詞模式的右側
\<PATTERN\> 匹配整個單詞
“`

分組

“`
分組:\(\) 將一個或多個字符捆綁在一起,當作一個整體進行處理,如:\(root\)\+
?分組括號中的模式匹配到的內容會被正則表達式引擎記錄于內部的變量中,這些變量的命名方式為: \1, \2, \3, …
“`
– #### 擴展的正則表達式和基本的正則表達式用法基本一樣,但比基本的正則表達式方便,用法是在正則表達式的基礎上去掉轉義符

shell腳本基礎

程序的編程風格分為兩類
> 1:過程式:以指令為中心,數據服務于數據
> 2:對象式:以數據為中心,指令服務于數據
高級語言大致分為兩種
> 編譯:高級語言–>編譯器–>目標代碼
java,C#
> 解釋:高級語言–>解釋器–>機器代碼
shell, perl, python

– ### shell腳本:
包含一些命令或聲明,并符合一定格式的文本文件
> 格式要求:在shell腳本中
> 首行需要寫shebang機制
> shebang寫做#!,#!的作用是告訴cpu此程序是什么機制
示例:#!的寫法
> #!/bin/bash
> #!/usr/bin/python
> #!/usr/bin/perl

> shell腳本的用途有:
> 自動化常用命令
> 執行系統管理和故障排除
> 創建簡單的應用程序
> 處理文本或文件

簡單的腳本可以由簡單的命令組合而成。
腳本的基本結構
> #!SHEBANG
> CONFIGURATION_VARIABLES
> FUNCTION_DEFINITIONS
> MAIN_CODE

示例

“`
#!/bin/bash
#—————————
# my first script
# owner :zhangxiao
#—————————

echo “hello”

“`

– vim的基本用法

vim可以打開編輯文件
如果后邊跟的名字的文件不存在則創建該空文件
“`
vim +(n) filename: 打開時光標處于文件的第n行
vim +/pattren filename:打開時光標處于pattern所匹配的位置
“`
– vim模式轉換
“`
輸入模式==》命令模式
esc
命令模式==》末行模式

末行模式==》命令模式
esc
“`
– 命令模式==》輸入模式
“`
i:光標所在的前面插入
I:光標所在的行首
a:光標所在的后面
A:光標所在行的行尾
o:光標所在行的下方開一個新行
O:光標所在行的上方開一個新行
“`
– 輸入模式下可以隨意輸入字符

末行模式下的基本操作

“`
:q 退出
:q!強行退出
:w 保存
:wq 保存退出
:x 保存退出
:w /path保存在指定文件中
“`
– 光標跳轉:
“`
h左
j下
k上
l右
“`
備注(n)h/j/k/l 向方向跳n個字符
“`
w一個單詞一個單詞的跳轉
b和w同意
e一個單詞一個單詞反方向跳轉
“`
備注(n)w/e/b向方向跳轉幾個單詞
“`
^ 行首(非空的)
0 行首(絕對)
$ 行尾
“`
– 行跳轉
“`
(n)G 跳轉到文件的第n行
G 跳轉到文件的最后一行
1G或gg跳轉到文件的首行
“`
段落間的移動
“`
{ 向前面段落移動
} 向后面段落移動
“`
命令模式下vim的編輯

刪除命令
“`
x:刪除光標處字符
(n)x:刪除光標處幾個字符
dd:刪除光標所在一整行
(n)dd:刪除光標所在的幾行
“`
粘貼命令
“`
p:緩沖區若存的為整行則粘貼時在光標的行的下方開一行
若存的不是整行則在光標的后面
P(大寫):與小寫P相反
“`
復制命令
“`
y:工作機制和d相同
“`
改變命令

“`
c:同d
但是執行完c后會直接轉入輸入模式
“`
替換命令
“`
r:替換字符
“`
可視化模式:類似于win模式的選中
“`
V:直接圈整行
v:按字符選定光標所在的位置
備注v經常結合dyc使用
“`
撤銷命令
u:撤銷一次
(n)u:撤銷幾次
Ctrl + r 反撤銷
U:直接撤銷至操作前

– ### 腳本編程入門

– 變量的種類

“`
本地變量:生效范圍為當前bash
環境變量:生效范圍是當前bash及其子進程
命令 或export生命環境變量
局部變量:生效范圍為當前bash中的某個代碼片段
位置變量:一般用$1,$2..代表,用于腳本在腳本調用中通過命令行傳遞給他的參數
特殊變量:類似$?,$0等在bash中表示特殊意義的變量

“`
– 變量的賦值方式:name=‘value’
> 1.可以是字符 name=“username”
> 2.可以是變量引用 name=“$username” 3.可以是命令的執行結果 name=`CMD `
> 或者name=$(CMD)

> 變量引用方式:${name} 大多數情況下可以省略
> {當變量名和后邊的內容不容易分清時,需要加花括號}

– 查看變量
> set查看所有變量
> unset name 取消本地變量

– 環境變量的聲明

> export a=name 聲明環境變量a
> dclear -x name=abc

– 顯示環境變量

“`
export
env
printenv
“`
– 變量命名法則

“`
1 不能使用程序中的保留字
2 變量名只能使用數字,字母,下劃線且不能使用數字揩油
3 盡量做到見名知意。
4 可以用駝峰法則
“`
只讀變量不能被改變值不能被終止只能等bash結束后自動消失

位置變量
用于腳本在腳本調用中通過命令行傳遞給他的參數
$1,$2,$3..對應調用的第1,2,個命令

– bash的配置文件

“`
1.全局配置:/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
2.個人配置:home/.bash_profile
/.bashrc
“`

profile類的:是為交互式shell提供配置

“`
使用su – 登錄的

功用:用于定義環境變量
命令運行或腳本

讀取順序:/etc/profile–> /etc/profile.d/*.sh–> ~/.bashrc_profile–>~/.bashrc–>/etc/bashrc
“`
后面的會覆蓋前面的內容,所以靠后的生效
bashrc類的::為非交互式登錄提供配置

“`
1使用 su 登錄的
2圖形界面打開終端
3執行腳本時
功用:定義別名
定義本地變量

讀取順序 ~/.bashrc–>/etc/bashrc–>/etc/profile.d/*.sh
“`
– #### 算數運算

“`
1.let var=算數表達式
2.var=$[算數表達式]
3.var=$((算數表達式))
4.var=$(expr arg1 arg2 arg3 …)
“`

條件判斷
“`
test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]
“`
備注:中括號兩邊必須有空格

數值判斷

“`
-gt:大于
-ge:大于等于
-eq:等于
-ne:不等于
-lt:小于
-le:小于等于
“`
字符串判斷

==:等于
> :大于(ASICI)
<:小于(ASICA)
!=:不等于
=~:是否能被PATTERN匹配
-z:是否為空
-n:是否不空
備注:字符串比較式都用該用引號

shell自定義退出狀態碼
> exit [n] 腳本中一旦遇到exit則腳本立即終止,終止狀態取決于腳本后面的數字
> 如果未指定狀態碼,則腳本退出狀態碼取決于最后一個參數執行成功與否

存在性測試

“`
-a FILE:同-e
-e FILE: 文件存在性測試,存在為真,否則為假
“`

存在性及類別測試

“`
-b FILE:是否存在且為塊設備文件
-c FILE:是否存在且為字符設備文件
-d FILE:是否存在且為目錄文件
-f FILE:是否存在且為普通文件
-h FILE 或 -L FILE:存在且為符號鏈接文件
-p FILE:是否存在且為命名管道文件
-S FILE:是否存在且為套接字文件
“`
文件權限測試:

“`
-r FILE:是否存在且可讀
-w FILE: 是否存在且可寫
-x FILE: 是否存在且可執行
“`

文件特殊權限測試:

“`
-u FILE:是否存在且擁有suid權限
-g FILE:是否存在且擁有sgid權限
-k FILE:是否存在且擁有sticky權限
“`

### 文件查找
– #### locate

非實時查找,也叫數據庫查找基于(/var/lib/locatedb)
> 默認大概每天更新一次,如果想用locate實時查找,可以用命令updatedb升級數據庫

備注:如果在白天線上服務器比較忙最好不要用updatadb 命令。(索引構建過程需要歷遍整個根文件消耗資源比較大,會耗費時間)
> 優點:速度快,不占用內存
> 缺點:常更新的文件不一定會搜索得到

語法:lacate KEYWORD
會顯示所有帶KEYWORD的文件或者目錄(包括路徑中帶有KEYRORD的)
示例
“`
[root@zhangxiao data]# locate /root/87*
/root/87_a
/root/87_jitu
/root/87scp.sh
[root@zhangxiao data]#
“`
find
實時查找
優點:比較準確
缺點:速度略慢會占用內存
語法:find [查找路徑] [查找條件] [處理動作]

查找路徑:指定具體的目錄路徑,默認為當前路徑
查找條件:指定查找的標準,可以以文件名、大小、類型、權限等
處理動作:對符合條件的文件做什么操作;默認輸出至屏幕
默認遞歸 查看文件夾中的文件

1.-name “FILENAME”,支持使用通配符
“`
示例
[root@zhangxiao etc]# find /root/ -name “87*”
/root/87_a
/root/87scp.sh
/root/87_jitu
[root@zhangxiao etc]#
“`
2.-iname “FILENAME”查找文件名稱不區分大小寫
“`
示例
[root@zhangxiao ~]# touch IiIiU
[root@zhangxiao ~]# find /root -iname ii*
/root/IiIiU
[root@zhangxiao ~]#
“`
3.regex “PATTERN” 以PATTERN匹配整個文件路徑查找字符串而不僅僅是文件名
“`
示例
[root@zhangxiao etc]# find /etc -regex “/etc/i.*”
/etc/inittab
/etc/init.conf
/etc/idmapd.conf
/etc/inputrc
/etc/init/tty.conf
/etc/init/ck-log-system-start.conf
/etc/init/rcS.conf
/etc/init/splash-manager.conf
/etc/init/prefdm.conf
/etc/init/control-alt-delete.conf
/etc/init/start-ttys.conf
/etc/init.d
[root@zhangxiao etc]#

“`
根據屬主屬組查找
1. -user USERNAME以屬主為username的文件
“`
示例
[root@zhangxiao data]# find /data -user “zhangxiao”
/data/dir11
/data/dir11/fa1
/data/dir11/passwd
/data/ff2
/data/dd23
/data/23
[root@zhangxiao data]#
“`
2. -group GROUPNAME 以屬組為指定組的文件
“`
示例
[root@zhangxiao data]# find /data -group xiaoxiao
/data/fa1
/data/23
[root@zhangxiao data]#
“`
3. -uid:查找屬主為指定UID的文件
“`
示例
[root@zhangxiao data]# find /data -uid “0”
/data
/data/testdir1
/data/testdir1/fa1
/data/testdir1/passwd
/data/testdi1
/data/lost+found
/data/passwd
/data/test1
/data/test1/passwd
[root@zhangxiao data]#
“`
4. -gid:查找屬組為指定GID的文件
“`
示例
[root@zhangxiao data]# find /data -gid “500”
/data/dir11
/data/dir11/fa1
/data/dir11/passwd
/data/ff2
/data/dd23
[root@zhangxiao data]
“`
5. -nouser: 查找沒有屬主的文件

“`
[root@zhangxiao xiaoxiao]# find /data -nouser
/data/f33
/data/f30
/data/f32
/data/f31
[root@zhangxiao xiaoxiao]#
“`

6. -nogroup:查找沒有屬組的文件
“`

根據文件類型查找

“`
1. -type
f:文件
d:目錄
“`
示例
[zhangxiao@zhangxiao ~]$find /data -type “d”
/data
/data/dir11
/data/testdir1
/data/testdi1
/data/lost+found
find: `/data/lost+found’: Permission denied
/data/test1
[zhangxiao@zhangxiao ~]$
“`
l:符號鏈接
s:套接字文件
b:塊設備文件
c:字符設備文件
p:管道文件
“`

組合條件

“`
-a :與
“`
[root@zhangxiao zhangxiao]# find /data -name “f*” -a -user “zhangxiao”
/data/dir11/fa1
/data/fa1
/data/ff2
[root@zhangxiao zhangxiao]#
“`
-o :或
-not,-! :非

!A -a !B= ?。ˋ -o B)
!A -o !B= ?。ˋ -a B)

“`
示例
[root@zhangxiao firmware]# find /etc -size “+1M” -type “f”
/etc/selinux/targeted/policy/policy.24
/etc/selinux/targeted/modules/active/policy.kern
/etc/gconf/gconf.xml.defaults/%gconf-tree.xml
[root@zhangxiao firmware]#
“`

根據文件大小查找

“`
1. -size [+|-]
常用單位:K、M、G
(-size 3k:是指大于等于2K到3K的文件)
(-size -3k:0-2K的文件)
(-size +3k:大于3K的文件)
“`

以時間戳為單位
以天為單位的

“`
-atime
-ctime
-mtime
(-atime 3大于等于3天不到4天 )
(-atime +3 四天之前)
(-atime -3 不到三天
“`

以分鐘為單位

“`
-amin
-cmin
-mmin
“`

按權限查找

“`
-perm 222精確匹配222
-perm 【+|-】mode
在此種情況下0表示不關心,7包括1、2、4.
-perm +222 (加號表示或者的關系)
-perm -222
(減號表示每一類對象都需要有這個權限)
“`
-maxdepth:查找的最大層級
-mindepth:查找的最小層級
示例
“`
[root@zhangxiao zhangxiao]# find /data -maxdepth “1” -size “2k” -ls
12 4 -rw-r–r– 1 root root 1682 Mar 31 11:18 /data/passwd
[root@zhangxiao zhangxiao]#
“`

處理動作:

“`
-print:默認的處理動作。輸出到屏幕
-ls:對查到的文件執行ll命令
-delete:刪除查找到的文件
-fls:查找到的文件信息以長格式保存在指定的目錄中
-ok CMD {}\;:對查找到的每一個文件執行CMD,執行前交互式要求用戶確認
-exec CMD {}\;:批量執行前面的CMD不需要確認
“`
find傳遞查找到的文件至后邊指定的命令是有些命令不能接受這么多參數此時 執行命令就會失敗,我們可以用一個方法解決
“`
find | xargs CMD
指的是一條一條命令傳給CMD
“`
find常配合cpio使用
cpio

“`
?功能:復制文件從或到歸檔
?cpio命令是通過重定向的方式將文件進行打包備份,還原恢復的工具,它可以解壓以“.cpio”或者“.tar”結尾的文件
?cpio [選項] > 文件名或者設備名
?cpio [選項] < 文件名或者設備名
?選項
-o 將文件拷貝打包成文件或者將文件輸出到設備上
-i 解包,將打包文件解壓或將設備上的備份還原到系統
-t 預覽,查看文件內容或者輸出到設備上的文件內容
-v 顯示打包過程中的文件名稱。
-d 解包生成目錄,在cpio還原時,自動的建立目錄
-c 一種較新的存儲方式
“`

壓縮,歸檔工具

1.gzip:只能壓縮文件不能壓縮目錄
gzip filename :壓縮文件
“`
示例
[root@zhangxiao zhangxiao]# gzip PAAA
[root@zhangxiao zhangxiao]# ls PAAA.gz
PAAA.gz
[root@zhangxiao zhangxiao]#
“`
-d:代表解壓縮,和unzip效果一樣
“`
示例
[root@zhangxiao zhangxiao]# gzip -d PAAA.gz
[root@zhangxiao zhangxiao]# ls
a.out Downloads hello.sh MUSIC per.sh pwa1 test1
Desktop excyte.sh helloword PAAA Pictures script.log txt.txt
Documents haha Music paBB Public Templates Videos
[root@zhangxiao zhangxiao]#
“`
-c:filename > filename.gz 保留源文件
-9:以9倍壓縮比壓縮(1-9)都可以
gungzip filename:解壓縮文件

zxat:不解壓直接查看文本文件內容

2.bz2:只能壓縮文件不能壓縮目錄
bzip filemane :壓縮文件
-d:解壓縮
-k:壓縮直接保留文件
“`
示例
[root@zhangxiao zhangxiao]# bzip2 -k paBB
[root@zhangxiao zhangxiao]# ls
a.out Downloads hello.sh MUSIC paBB.bz2 Public Templates Videos
Desktop excyte.sh helloword PAAA per.sh pwa1 test1
Documents haha Music paBB Pictures script.log txt.txt
[root@zhangxiao zhangxiao]#
“`
-q:靜默過程
-9:(1-9)幾倍壓縮比
bunzip2 :解壓縮
bzcat:不解壓直接查看文件

3.xz:壓縮文件
xz filename 壓縮文件
-d:代表解壓縮,和unzip效果一樣
-k:保留源文件
-9:以9倍壓縮比壓縮(1-9)都可以
xzcat:不解壓直接查看文件

#### tar
歸檔文件

“`
1.創建歸檔
tar -c -f /PATH/TO/SOMEFILE.tar file…
2.查看歸檔文件中的列表
tar -t -f PATH/TO/SOMEFILE.tar
3.展開歸檔
tar -x -f PATH/TO/SOMEFILE.tar
tar -x -f PATH/TO/SOMEFILE.tar -C \PATH/TO/DIR(歸檔到指定文件)
“`
歸檔的同時壓縮
-J:xz -j:bzip2 -z:gzip

## sed
sed:行編輯器,逐行處理
語法:sed:[option]… ‘script’ inputfile
sed /地址定界/命令 文件
常用選項

“`
-n :靜默模式,不輸出模式中的內容弄到屏幕
-e :多點編輯功能
-f :/PATH/TO/SCRIPT_FILE從指定文件中讀取編輯腳本
-r :擴展正則表達式
-i:修改原文件

“`
地址定界

“`
(1):不給地址:對全文進行處理
(2):單地址
#:第幾行
/PATTERN/:此模式匹配的每一行
(3)地址范圍
#,#:第幾行到第幾行
#,+#:第幾行到加幾行
/PATTERN1/,/PATTERN2/:匹配的行到匹配的行
#,/PATTERN/
“`

編輯命令

“`
d:刪除地址范圍的內容
p:輸出到屏幕上
a \’內容’:在每一個符合條件的行后加入內容
i \‘內容’:每一行前面插入內容
c \’內容‘:替換所在的行為內容
w /PATH/FILENAME:匹配的內容另存為文件為指定路徑文件
r /PATH/FILENAME:把指定文件中的內容讀取到匹配的后面
=:為模式空間中的行打印行號
!:取反條件
s////:查找替換,支持使用其他分隔符如s@@@\s###
替換標記
g:行內全局替換
p:顯示替換的行
w /PATH/TO/SOMEFILE將替換成功的結果保存到文件中-
“`

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/96072

(0)
a.張笑a.張笑
上一篇 2018-04-15 15:43
下一篇 2018-04-15 16:08

相關推薦

  • 常用信息查詢

    版本 發行版本 cat /etc/centos-releaseCentOS Linux release 7.4.1708 (Core) /*1708 17年8月發布*/ lsb_release -a /*顯示上面文件內容*//*要安裝工具*/ nano /etc/centos-release /*修改*//*生產中 盡量不要暴露版本號*/ 內核版本 name…

    Linux筆記 2018-04-08
  • linux基礎知識

    本博文寫的是linux的基礎知識,比較雜,但是都很重要。

    Linux筆記 2018-07-22
  • 2018第十屆GOPS全球運維大會9月上海召開!

    第十屆 GOPS 全球運維大會將于2018年9月14日-15日在上海召開。大會為期2天,側重方向是 AIOps、運維自動化和 DevOps。目前已經有全國各地大公司組團前來參加。

    2018-06-22
  • 權限

    chmod 更改權限 語法 1 who 對誰操作 opt做什么操作 per 跟什么權限 跟文件 who u g o a opt +增加 -減掉 =覆蓋 per rwx reset 重復系統 文本文件 r 讀 打開 w 改 x 執行程序 chown 更改所有者 chgrp 更改所屬組 chmod who (u) opt (g)per(o) file文件 綠色有…

    Linux筆記 2018-04-08
  • shell筆記

    在學習的時候整理的零散筆記

    Linux筆記 2018-04-14
  • 網絡安全基礎知識和ssh

    加密基礎 NISI定義的數據安全 保密性:數據保密性,隱私性 完整性:數據完整性,系統完整性 可用性:能正常獲取其中信息 安全攻擊 被動攻擊:竊聽 主動攻擊:偽裝(利用telnet偽裝身份發郵件,利用dig查找郵件服務器),重放,消息篡改,拒絕服務 安全機制 加密,數據簽字,訪問控制,數據完整性,認證交換,流量填充,路由控制,公正 安全服務 認證;訪問控制;…

    2018-05-20
欧美性久久久久