一、環境變量
1、/etc/profile:在登錄時,操作系統定制用戶環境時使用的第一個文件,此文件為系統的每個用戶設置環境信息,當用戶
第一次登錄時,該文件被執行。
2、/etc/environment:在登錄時操作系統使用的第二個文件,系統在讀取你自己的profile前,設置環境文件的環境變量。
3、~/.bash_profile:在登錄時用到的第三個文件是.bash_profile文件,每個用戶都可使用該文件輸入專用於自己使用的
shell信息,當用戶登錄時,該文件僅僅執行一次!默認情況下,他設置一些環境變量,執行用戶的.bashrc文
件。/etc/bash.bashrc:為每一個運行bash shell的用戶執行此文件,當bash shell被打開時,該文件被讀取。
4、~/.bashrc:該文件包含專用於你的bash shell的bash信息,當登錄時以及每次打開新的shell時,該該文件被讀取。
幾個文件的優先級:1>2>3在linux下,如果是bash環境,用戶登錄時讀取設置文件的順序是/etc/profile -->
~/.bash_profile --> ~/.bashrc --> /etc/bash.bashrc。
注意在~/.bash_profile這一步,如果沒有~/.bash_profile ,則默認讀取~/.bash_login,如果沒有~/.bash_login 才讀取
~/.profile。
根據發行版本的情況,有兩個基本的系統級配置文件:/etc/bash.bashrc和/etc/profile。這些配置文件包含兩組不同的
變量:shell變量和環境變量。
前者只是在特定的shell中固定(如bash),後者在不同shell中固定。shell變量是局部的,而環境變量是全局的。
注意:盡量避免修改root用戶的環境變量配置文件,因為那樣可能會造成潛在的危險。最好不要把當前路徑”./”放到
PATH裡,這樣可能會受到意想不到的攻擊。
使用:
把設置的環境變量給所有用戶使用:/etc/bashrc;/etc/profile
修改全局的環境變量在/etc/profile
修改某個用戶的環境變量在/home/用戶名/.bash_profile
目前在Ubuntu中有二種設置PATH環境變量的方法。
為單一用戶:
打開用戶主目錄下的.bashrc,在這個文件中加入export PATH=”$PATH:/your path1/:/your path2/…..”
重啟或注銷就好了。
全局設置:
在/etc/profile中增加
PATH="$PATH:/home/zhengb66/bin"
export PATH
二、打開txt文件亂碼
txt文件默認是GBK編碼的,而linux系統用的是UTF-8編碼
打開應用程序——系統工具——配置編輯器。如果沒有的話打開系統——首選項——主菜單——系統工具——配置編輯器。
依次點開
apps->gedit-2->preferences->encodings 中的auto-detected
在雙擊彈出對話框中加入GB18030,GBK,GB2312,然後將GB18030,GB2312移到最上
再次打開.txt文件,問題解決了。
三、去掉^M
習慣保存一些腳本文件,如果通過samba方式傳遞到Ubuntu下,用vi查看編輯此類文件時候,總會有^M出現在行尾(如:echo $contents ^M),這是因為windows下的換行符與unix上的不同。
如何快速去掉^M呢,采取以下步驟就行了:
1. vi dosfilename
2. Press Esc
3. Enter this string: %s/^M//g (^M = Ctrl v + Ctrl m)
4. Press enter (the ^M cleared!)
5. :wq! (save the file)
vim內部就可以做這件事情。首先打開文本,然後 set fileformat=unix
四、sudo不用輸入密碼
通常我們並不以root身份登錄,但是當我們執行某些命令 (command)時需要用到root權限,我們通常都是用"sudo
command"來執行command。由於使用Ubuntu,所以經常都都用sudo,而使用sudo時,又得輸入密碼,下面介紹
sudo不輸入密 碼的方法。
假設我的用戶名為jay(屬於 admin組),使sudo不用密碼的方法如下:
運行命令:sudo visudo 或者 sudovi /etc/sudoers,如果vi來編輯,則保存時記得用"wq!"強制保存,否則會提示只讀
不能保存的。就會編輯/etc/sudoers這個文件。 默認情況我們會看到有"%admin ALL=(ALL) ALL"一句話,就是允許
admin組在所有主機上執行所有命令,當然是需要passwd的。
1. 如果想把admin組的用戶都sudo不用密碼那麼可以將這一行換為:"%admin ALL=(ALL) NOPASSWD: ALL"即可。
2. 如果僅僅想讓jay用戶sudo不需密碼,則可添加"jay ALL = NOPASSWD: ALL"這樣一行。
3. 如果讓jay用戶sudo不用密碼即可執行某幾個命令,可這樣寫"jay ALL =
NOPASSWD: /usr/bin/abc.sh, /usr/sbin/adduser"
4. 欲知其他更多配置方式,請運行"man sudoers"看幫助文檔吧。
注意:我自己的一個配置沒生效,找原因還找了陣子,寫到這裡吧。
我添 加"jay ALL = NOPASSWD: ALL"這樣一行;但是,jay執行sudo時還是需要輸入密碼,這是為什麼?
原來是, 我這一行在"%admin ALL=(ALL) ALL"組策略之前,後面的組配置覆蓋了前面的配置,而jay屬於admin
組,所以需要密碼。這時, 只需要將%admin行用#注釋掉即可。OK!然後立馬就生效了,可能執行sudo時系統
都會去讀取/etc/sudoers的,所以立即就生效了。
五、常用打包命令
gzip命令:
常用參數:
-c:將壓縮過程中產生的內容輸出到屏幕上,與>結合,可以保留原始文件
例:#gzip -c man.config >man.config.gz
壓縮完成後 man.config文件還會保留
-d:解壓參數
-v:在壓縮過程中顯示壓縮比等信息
-t:用來檢驗壓縮文件的一致性
-n:n的值為1-9,代表壓縮的等級 其中1最快 9壓縮比最好 默認為6
zcat命令:
可以不解壓文件,直接預覽後綴名為:*.gz的壓縮文件內容
bzip2命令:
常用參數:
-c:將壓縮過程中產生的資料輸出到屏幕上
-d:解壓參數
-z:壓縮參數
-k:保留原有文件
-v:在壓縮過程中顯示壓縮比等信息
-n:n的值為1-9 與gzip一樣.1為最快,9為最好
bzcat命令:
可以不解壓文件,直接預覽後綴名為:*.bz2的壓縮文件
tar命令:
常用參數
-p 保留原文件的權限與屬性,備份重要文件時最好加上
--exclude=filename 打包某目錄,但不包含filename這個文件
常見的三種用法:
打包並壓縮文件:
tar -c[z/j]vf 新文件名.tar.[gz/bz2] 要打包壓縮的文件名
-c:打包
-z:意為調用gzip命令壓縮文件.對應的新文件名後綴為*.tar.gz
-j:意為調用bzip2命令,對應的新文件名後綴為*.tar.bz2
-v:在壓縮過程中,將正在處理的文件名顯示出來
-f:filename的意思,後面接文件名.
查詢:
tar -t[z/j]vf 文件名
-t:不解壓打包文件,查詢打包文件裡的所有文件名
解包:
tar -x[j/z]vf filename -C 欲解壓到的目錄
-x:解包
-C:將包解壓到指定目錄
小技巧:
只打開包文件中的某一個文件
第一步,先查找出需解壓文件在包中的正確文件名
tar -t[z/j]vf 包的名字 |grep '欲解壓的文件名'
tar -x[j/z]vf 包的名字 欲解壓的文件名
只備份比某一時刻新的文件
三個時間點的解釋:
mtime(modification time)當文件的內容發生改變時,系統會記錄這個改變時間
atime(status time)當文件的狀態發生改變時,如權限,屬性發生改變,該時間會發生改變
ctime(access time)當文件被訪問後,該時間會發生改變
使用 ll命令時,顯示的時間默認是mtime
兩個參數的解釋
--newer後面接的時間包含mtime,atime兩種狀態
--newer-mtime只包含mtime一種
假如10月15日用tar命令備份過/etc目錄,10月30日備份時只想將15號後/etc目錄中內容發生改變的文件重新備份一下,
可以使用以下命令:
tar -cjvf etc.tar.bz2 --newer-mtime="2009/10/15" /etc/*
六、grep與正則表達式
正則表達式只是一種表示法,只要工具支持這種表示法, 那麼該工具就可以處理正則表達式的字符串。vim、grep、awk 、sed 都支持正則表達式,也正是因為由於它們支持正則,才顯得它們強大。
1. 基礎正則表達式
grep 工具,以前介紹過。
grep -[acinv] '搜索內容串' filename
-a 以文本文件方式搜索
-c 計算找到的符合行的次數
-i 忽略大小寫
-n 順便輸出行號
-v 反向選擇,即找 沒有搜索字符串的行
其中搜索串可以是正則表達式!
(1) 搜索有the的行,並輸出行號
$grep -n 'the' regular_express.txt
(2) 搜 索沒有the的行,並輸出行號
$grep -nv 'the' regular_express.txt
(3) 利 用[]搜索集合字符
[] 表示其中的某一個字符 ,例如[ade] 表示a或d或e
$ grep -n 't[ae]st' regular_express.txt
8:I can't finish the test.
9:Oh! the soup taste good!
可以用^符號做[]內的前綴,表示除[]內的字符之外的字 符。
比如搜索oo前沒有g的字符串所在的行. 使用 '[^g]oo' 作搜索字符串
$ grep -n '[^g]oo' regular_express.txt
2:apple is my favorite food.
3:Football game is not use feet only.
18:google is the best tools for search keyword.
19:goooooogle yes!
[] 內可以用范圍表示,比如[a-z] 表示小寫字母,[0-9] 表示0~9的數字, [A-Z] 則是大寫字母們。[a-zA-Z0-9]表示所有數
字與英文字符。 當然也可以配合^來排除字符。
(4) 搜索包含數字的行
$ grep -n '[0-9]' regular_express.txt
5:However ,this dress is about $ 3183 dollars.
15:You are the best is menu you are the no.1.
行首與行尾字符 ^ $. ^ 表示行的開頭,$表示行的結尾( 不是字符,是位置)那麼‘^$’ 就表示空行,因為只有行首和行
尾。這裡^與[]裡面使用的^意義不同。它表示^後面的串是在行的開頭。比如搜索the在開頭的行
$ grep -n '^the' regular_express.txt
12:the symbol '*' is represented as star.
(5) 搜索以小寫字母開頭的行
$ grep -n '^[a-z]' regular_express.txt
2:apple is my favorite food.
4:this dress doesn't fit me.
10:motorcycle is cheap than car.
12:the symbol '*' is represented as star.
18:google is the best tools for search keyword.
19:goooooogle yes!
20:go! go! Let's go.
(6) 搜索開頭不是英文字母的行
$ grep -n '^[^a-zA-Z]' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
21:#I am VBird
(7) $表示它前面的串是在行的結尾,比如 '/.' 表示 . 在一行的結尾搜索末尾是.的行
$ grep -n '/.$' regular_express.txt //. 是正則表達式的特殊符號,所以要用/轉義
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
4:this dress doesn't fit me.
5:However ,this dress is about $ 3183 dollars.
6:GNU is free air not free beer.
.....
注意在MS的系統下生成的文本文件,換行會加上一個 ^M 字符。所以最後的字符會是隱藏的^M ,在處理Windows
下面的文本時要特別注意!
可以用cat dos_file | tr -d '/r' > unix_file 來刪除^M符號。 ^M==/r
那麼'^$' 就表示只有行首行尾的空行拉!
(8) 搜索空行
$ grep -n '^$' regular_express.txt
22:
23:
(9) 搜索非空行
$ grep -vn '^$' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
4:this dress doesn't fit me.
..........
(10) 任意一個字符. 與重復字符 *
在bash中*代表通配符,用來代表任意個 字符,但是在正則表達式中,他含義不同,*表示有0個或多個 某個字符。
例如 oo*, 表示第一個o一定存在,第二個o可以有一個或多個,也可以沒有,因此代表至少一個o.
點. 代表一個任意字符,必須存在。 g??d 可以用 'g..d' 表示。 good ,gxxd ,gabd .....都符合。
$ grep -n 'g..d' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
9:Oh! the soup taste good!
16:The world is the same with 'glad'.
(11) 搜索兩個o以上的字符串
$ grep -n 'ooo*' regular_express.txt //前兩個o一定存在,第三個o可沒有,也可有多個。
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
9:Oh! the soup taste good!
18:google is the best tools for search keyword.
19:goooooogle yes!
(12) 搜索g開頭和結尾,中間是至少一個o的字符串,即gog, goog....gooog...等
$ grep -n 'goo*g' regular_express.txt
18:google is the best tools for search keyword.
19:goooooogle yes!
(13) 搜索g開頭和結尾的字符串在的行
$ grep -n 'g.*g' regular_express.txt // .*表示 0個或多個任意字符
1:"Open Source" is a good mechanism to develop programs.
14:The gd software is a library for drafting programs.
18:google is the best tools for search keyword.
19:goooooogle yes!
20:go! go! Let's go.
限定連續重復字符的范圍 { }
. * 只能限制0個或多個, 如果要確切的限制字符重復數量,就用{范圍} 。范圍是數字用,隔開 2,5 表示2~5個,
2表示2個,2, 表示2到更多個
注意,由於{ }在SHELL中有特殊意義,因此作為正則表達式用的時候要用/轉義一下。
(14)搜索包含兩個o的字符串的行
$ grep -n 'o/{2/}' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
9:Oh! the soup taste good!
18:google is the best tools for search keyword.\
19:goooooogle yes!
(15) 搜索g後面跟2~5個o,後面再跟一個g的字符串的行
$ grep -n 'go/{2,5/}g' regular_express.txt
18:google is the best tools for search keyword.
(16) 搜索包含g後面跟2個以上o,後面再跟g的行
$ grep -n 'go/{2,/}g' regular_express.txt
18:google is the best tools for search keyword.
19:goooooogle yes!
注意,相讓[]中的^ - 不表現特殊意義,可以放在[]裡面內容的後面。
'[^a-z/.!^ -]' 表示沒有小寫字母,沒有. 沒有!, 沒有空格,沒有- 的 串,注意[]裡面有個小空格。
另外shell 裡面的反向選擇為[!range], 正則裡面是 [^range]
2擴展正則表達式
擴展正則表達式是對基礎正則表達式添加了幾個特殊構成的。它令某些操作更加方便。
比如我們要去除 空白行和行首為 #的行, 會這樣用:
$ grep -v '^$' regular_express.txt | grep -v '^#'
"Open Source" is a good mechanism to develop programs.
apple is my favorite food.
Football game is not use feet only.
this dress doesn't fit me.
............
然而使用支持擴展正則表達式的 egrep 與擴展特殊符號 | ,會方便許多。
注意grep只支持基礎表達式, 而egrep 支持擴展的, 其實 egrep 是 grep -E 的別名而已。因此grep -E 支持擴展正
則。
那麼:
$ egrep -v '^$|^#' regular_express.txt
"Open Source" is a good mechanism to develop programs.
apple is my favorite food.
Football game is not use feet only.
this dress doesn't fit me.
....................
這裡| 表示或的關系。 即滿足 ^$ 或者 ^# 的字符串。
這裡列出幾個擴展特殊符號:
+, 於 . * 作用類似,表示 一個或多個重復字符。
?, 於 . * 作用類似,表示0個或一個字符。
|,表示或關系,比如 'gd|good|dog' 表示有gd,good或dog的串
(),將部分內容合成一個單元組。 比如 要搜索 glad 或 good 可以這樣 'g(la|oo)d'
()的好處是可以對小組使用 + ? * 等。
比如要搜索A和C開頭結尾,中間有至少一個(xyz) 的串,可以這樣 : 'A(xyz)+C'