1. 程式人生 > >2018-06-01筆記(特殊符號 、cut、wc、sort、uniq、tee、tr、split)

2018-06-01筆記(特殊符號 、cut、wc、sort、uniq、tee、tr、split)

linux

8.10 shell特殊符號&cut命令

shell常用的幾個特殊符號

“*” 代表零個或多個任意字符

[root@localhost ~]# ls  test*
test  test1  test2  test3

“?” 代表一個任意字符

[root@localhost ~]# ls  test?
test1  test2  test3

“#” 註釋符號

[root@localhost ~]# a=111 #aaaaa
[root@localhost ~]# echo $a
111

“\” 脫意符號,‘’單引號也有脫意的意思,將特殊符號(例如‘*‘)還原為普通字符

[root@localhost ~]# ls -d test\*
ls: 無法訪問test*: 沒有那個文件或目錄

“|” 管道符,它的作用在於將符號前面命令的輸出當作後面命令的輸入,並不是所有的命令都可以的,一般針對文檔操作的命令比較常用,例如cat, less, head, tail, grep, cut, sort, wc, uniq, tee, tr, split, sed, awk等等

[root@localhost ~]# cat test.txt |wc -l
0

命令 : cut

用來截取某一個字段

語法: cut -d ‘分隔字符‘ [-cf] n 這裏的n是數字
-d:指定分隔符號
-f:指定第幾段
-c:後面只有一個數字表示截取第幾個字符;後面跟一個數字區域,表示截取從幾到幾(該選項不和d,f共同使用)

[root@localhost tmp]# cut -c1 /etc/passwd
r
b
...
[root@localhost tmp]# cut -c1,4 /etc/passwd              #表示截取第1個和第4個字符
rt
b:
...
[root@localhost tmp]# cut -c1-4 /etc/passwd             #表示截取第1個到第4個字符
root
bin:
...
[root@localhost tmp]# cut -d : -f 3 /etc/passwd         #-d以冒號分割,-f截取第3段
0
1
2

8.11 sort、wc、uniq命令

命令 : sort

sort 用做排序(sort不加任何選項,則從首字符向後,依次按ASCII碼值進行比較,最後將他們按升序輸出,)

語法: sort [-t 分隔符] [-kn1,n2] [-nru] 這裏的n1 < n2

-t 分隔符 :作用跟cut的-d一個意思

-n :使用純數字排序,需要註意的是使用-n特殊字符和字母默認為0

-r :反向排序

-u :去重復

-kn1,n2 :由n1區間排序到n2區間,可以只寫-kn1,即對n1字段排序

[root@localhost ~]# head -n5 /etc/passwd |sort -t: -k3 -n
-t 後面跟分隔符,-k後面跟數字,表示對第幾個區域的字符串排序,-n 則表示使用純數字排序
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@localhost tmp]# sort /etc/passwd  
 #不加sort不加任何選項,則從首字符向後,依次按ASCII碼值進行比較,最後將他們按升序輸出
adm:x:3:4:adm:/var/adm:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@localhost ~]# head -n5 /etc/passwd |sort -t: -k3,5 -r
-k3,5 表示從第3到第5區域間的字符串排序,-r表示反向排序
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
root:x:0:0:root:/root:/bin/bash

命令 : wc

用於統計文檔的行數、字符數、詞數,常用的選項為:

-l :統計行數

-m :統計字符數

-w :統計詞數

[root@localhost tmp]# wc -l 1.log 
4 1.log
[root@localhost tmp]# cat 1.log 
111
abc
&adfjkd
2233323
[root@localhost tmp]# wc -m 1.log 
### wc -m會統計文件內所有字符,包括隱藏的換行符“&”所以會顯示24
24 1.log
[root@localhost tmp]# wc 1.log 
### wc 不跟任何選項,直接跟文檔,則會把行數、詞數、字符數依次輸出
 4  4 24 1.log

命令 : uniq
uniq命令用於報告或忽略文件中的重復行,一般與sort命令結合使用(即:去重復)
語法: uniq [options] [filename]
Options:
-c:=count 在每列旁邊顯示該行重復出現的次數

[root@localhost tmp]# cat 1.log
111
abc
&adfjkd
2233323
111
abc
[root@localhost tmp]# uniq -c 1.log
      1 111
      1 abc
      1 &adfjkd
      1 2233323
      1 111
      1 abc
###直接使用uniq命令,1.log內容顯示並沒有變化,使用sort排序後再用uniq命令,在對文件進行去重之前需要先進行排序
[root@localhost tmp]# sort 1.log |uniq -c
      2 111
      1 2233323
      2 abc
      1 &adfjkd

8.12 tee、tr、split命令

命令 : tee
tee 常用在管道符 “|” 後
tee命令用於將數據重定向到文件,會刪除文件內原有內容,與“>”不同的是,tee會把定向的文件內容顯示出來。
語法: tee [options] [filename]
Options:
-a:向文件中重定向時使用追加模式(=“>>”)

[root@localhost tmp]# echo "aaa"|tee test.txt
aaa
[root@localhost tmp]# cat test.txt 
aaa
[root@localhost tmp]# echo "bbb"|tee test.txt  ##不加-a會把這前的內容清空
bbb
[root@localhost tmp]# cat test.txt
bbb
[root@localhost tmp]# echo "ccc"|tee -a test.txt    ###加了a選項後,追加內容
ccc
[root@localhost tmp]# cat test.txt 
bbb
ccc

命令 : tr
替換字符,常用來處理文檔中出現的特殊符號,它可以將一個字符變成另一個字符,也可以將一組字符變成另一組字符

[root@localhost tmp]# head -3 /etc/passwd|tr ‘a-z‘ ‘A-Z‘ 
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN
DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN
[root@localhost tmp]# head -3 /etc/passwd |tr ‘b‘ ‘B‘
root:x:0:0:root:/root:/Bin/Bash
Bin:x:1:1:Bin:/Bin:/sBin/nologin
daemon:x:2:2:daemon:/sBin:/sBin/nologin

命令 : split
split命令可以將一個大文件分割成很多個小文件,有時需要將文件分割成更小的片段,比如為提高可讀性,生成日誌等
語法: split [options] [filename]
-b:指定每一輸出檔案的大小,默認單位為 byte,可自定義單位,如 split -b 100M filename
-l:指定每一個輸出檔案的行數多少

 [root@localhost tmp]# dd if=/dev/zero of=/tmp/2.log bs=20K count=1           ###生成一個20K的文件
記錄了1+0 的讀入
記錄了1+0 的寫出
20480字節(20 kB)已復制,0.000199124 秒,103 MB/秒
[root@localhost tmp]# du -sb /tmp/2.log 
20480   /tmp/2.log
[root@localhost tmp]# split -b 5k /tmp/2.log luo                                           ##-b把2.log按照5K一個文件進行分割,luo指定分割後文件前綴!
[root@localhost tmp]# ll
-rw-r--r-- 1 root root 20480 6月   3 17:40 2.log
-rw-r--r-- 1 root root  5120 6月   3 17:41 luoaa
-rw-r--r-- 1 root root  5120 6月   3 17:41 luoab
-rw-r--r-- 1 root root  5120 6月   3 17:41 luoac
-rw-r--r-- 1 root root  5120 6月   3 17:41 luoad

-l:指定每一個輸出檔案的行數多少

[root@localhost tmp]# wc -l 1.txt              
20 1.txt
[root@localhost tmp]# split -l 5 1.txt
[root@localhost tmp]# ls
xaa
xab
xac
xad
[root@localhost tmp]# wc -l x*
  5 xaa
  5 xab
  5 xac
  5 xad

8.13 shell特殊符號(下)
$ 除了用於變量前面的標識符外,和 ‘!’ 結合起來使用,表示上一條命令中的最後一個變量

[root@localhost tmp]# ls 1.log 
1.log
[root@localhost tmp]# cat !$             #這裏可以看到!$表示上一條命令的1.log
cat 1.log
111
abc

`~ : 用戶的家目錄,如果是root則是 /root ,普通用戶則是 /home/username

[root@localhost ~]# cd ~
[root@localhost ~]# pwd
/root
[root@localhost ~]# su test
[test@localhost root]$ cd ~
[test@localhost ~]$ pwd
/home/test

& : 如果想把一條命令放到後臺執行的話,則需要加上這個符號。通常用於命令運行時間非常長的情況

[root@localhost tmp]# sleep 10&
[1] 1831
[root@localhost tmp]# jobs
[1]+  運行中               sleep 10 &

,>, >>, 2>, 2>> 正確的寫法應該是(1> 1>> 2> 2>> ,1表示正確輸出重定向和追加,2表示錯誤輸出重定向和追加,通常1可以忽略不寫)如果想要正確和錯誤輸出都寫到一個文件裏可以這樣2>&1

[root@localhost tmp]# mkdir 222
[root@localhost tmp]# cd 222
[root@localhost 222]# ll
總用量 0
[root@localhost 222]# touch 1.txt 2.txt 3.txt
[root@localhost 222]# ll
總用量 0
-rw-r--r-- 1 root root 0 6月   3 17:57 1.txt
-rw-r--r-- 1 root root 0 6月   3 17:57 2.txt
-rw-r--r-- 1 root root 0 6月   3 17:57 3.txt
[root@localhost 222]# ls 1.txt 2.txt 3.txt 4.txt >5.txt 2>&1
[root@localhost 222]# cat 5.txt
ls: 無法訪問4.txt: 沒有那個文件或目錄
1.txt
2.txt
3.txt

命令連接符: “||”、“&&”、“;”
command1 ; command2 : 不管command1是否執行成功都會執行command2
command1 && command2 : 只有command1執行成功後才會執行command2
command1 || command2 : 表示command1執行成功後,command2不執行,否則執行command2
擴展鏈接:
Linux 系統添加操作記錄審計

有時候我們需要對線上用戶操作記錄進行歷史記錄待出現問題追究責任人,,但Linux系統自帶的history命令用戶有自行刪除權限,那怎麽設置可以讓用戶的操作記錄實時記錄,並保證普通用戶無權刪除呢?

1.mkdir -p /usr/local//records/

  chmod 777 /usr/local/domob/records/

  chmod +t /usr/local/domob/records/

2.vi /etc/profile 在最後添加下面的代碼

if [ ! -d  /usr/local/domob/records/${LOGNAME} ]

then

mkdir -p /usr/local/domob/records/${LOGNAME}

chmod 300 /usr/local/domob/records/${LOGNAME}

fi

export HISTORY_FILE="/usr/local/domob/records/${LOGNAME}/bash_history"

export PROMPT_COMMAND=‘{ date "+%Y-%m-%d %T ##### $(who am i |awk "{print \$1\" \"\$2\" \"\$5}") #### $(history 1 | { read x cmd; echo "$cmd"; })"; } >>$HISTORY_FILE‘

關於PROMPT_COMMAND環境變量的含義 http://www.linuxnote.org/prompt_command-environment-variables.html
source exec 區別 http://alsww.blog.51cto.com/2001924/1113112
Linux特殊符號大全 http://ask.apelearn.com/question/7720
sort並未按ASCII排序 http://blog.csdn.net/zenghui08/article/details/7938975

2018-06-01筆記(特殊符號 、cut、wc、sort、uniq、tee、tr、split)