文本工具知識
- 文件內容: cat ,more,less
- 文件截取:head,tail
- 按列抽取:cut
- 排序和統計:sort,wc
- 按關鍵字抽取:grep
文件查看:cat,nl,tac,rev
cat [OPTION]... [FILE]...
-E:顯示行結束符$ -n:對顯示出的每一行進行編號
-A:顯示所有控制符
-b:非空行編號
-s:壓縮連續的空行成一行
nl
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 [OPTION]... [FILE]...
-d DELIMITER: 指明分隔符,默認tab
-f FILEDS:
#: 第#個字段
#,#[,#]:離散的多個字段,例如1,3,6
#-#:連續的多個字段, 例如1-6
混合使用:1-3,7
-c 按字符切割
--output-delimiter=STRING指定輸出分隔符
顯示文件或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
計數單詞總數、行總數、字節總數和字符總數
可以對文件或STDIN中的數據運行
wc story.txt
39 237 1901 story.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
比較文件
比較兩個文件之間的區別
diff foo.conf foo2.conf
5c5
< use_widgets = no
use_widgets = yes
註明第5行有區別(改變)
複製對文件改變patch
diff 命令的輸出被保存在一種叫做“補丁”的文件中
使用 -u 選項來輸出“統一的(unified)”diff格式文件,最適用於補丁文件
patch 複製在其它文件中進行的改變(要謹慎使用)
適用 -b 選項來自動備份改變了的文件
diff -u foo.conf foo2.conf > foo.patch
patch -b foo.conf foo.patch
1、統計出/etc/passwd文件中其默認shell爲非/sbin/nologin的用戶個數,並將用戶都顯示出來
[root@centos6 ~]#grep -v '/sbin/nologin' /etc/passwd |wc -l
6
[root@centos6 ~]#grep -v '/sbin/nologin' /etc/passwd |cut -d: -f1
root
sync
shutdown
halt
mageia
slackware
2、查出用戶UID最大值的用戶名、UID及shell類型
[root@centos6 ~]#sort -n -k3 -t ':' /etc/passwd |tail -1|cut -d: -f1,3,7
slackware:2002:/bin/tcsh
3、統計當前連接本機的每個遠程主機IP的連接數,並按從大到小排序
[root@centos6 ~]#cat ss.log | tr -s " " ":" | egrep '[[:digit:]]' | cut -d ":" -f 6 | sort | uniq -c | sort -nr
44 127.0.0.1
10 113.234.28.244
8 124.64.18.135
6 45.62.217.224
6 210.21.36.228
6 106.38.128.110
5 116.227.232.42
4 59.46.213.114
3 144.76.4.41
2 5.9.70.117
1 91.191.250.142
1 66.249.66.158
1 66.249.66.129
1 61.151.178.165
1 61.149.193.234
1 61.136.204.138
1 5.188.210.39
1 40.77.189.81
1 218.2.216.30
1 202.100.205.245
1 183.226.12.140
1 180.174.58.237
1 120.194.3.98
1 117.136.38.134
1 116.255.176.86
1 112.33.255.134
1 101.200.188.230
1 100.100.110.61
4、編寫腳本 createuser.sh,實現如下功能:使用一個用戶名做爲參數,如果 指定參數的用戶存在,就顯示其存在,否則添加之;顯示添加的用戶的id號等 信息
[root@centos6 ~]#cat createuser.sh
#!/bin/bash
#使用一個用戶名做爲參數,如果指定參數的用戶存在,就顯示其存在,否則添加之;顯示添加的用戶的id號等信息
#定義變量
read -p "請輸入一個用戶名:" USERNAME
#判斷用戶名是否存在
if `id $USERNAME &> /dev/null`;then
# 若存在,則顯示其存在,輸出ID等信息
echo "用戶存在,用戶的ID信息爲:`id $USERNAME`"
else
# 若不存在,則添加用戶,設置密碼爲隨機8位,下次登錄時提示修改密碼,同時顯示ID等信息
PASSWORD=`cat /dev/urandom |tr -cd [:alpha:] |head -c8`
`useradd $USERNAME &> /dev/null`
`echo "$PASSWORD" | passwd --stdin $USERNAME &> /dev/null`
echo "用戶名:$USERNAME 密碼: $PASSWORD" >> user.txt
`chage -d 0 $USERNAME`
echo "用戶已添加,用戶的ID信息爲:`id $USERNAME` 密碼爲:$PASSWORD"
fi
#刪除變量
unset name passwd
[root@centos6 ~]#source createuser.sh
請輸入一個用戶名:mageia
用戶存在,用戶的ID信息爲:uid=1100(mageia) gid=1100(mageia) groups=1100(mageia)
[root@centos6 ~]#source createuser.sh
請輸入一個用戶名:wang
用戶已添加,用戶的ID信息爲:uid=2003(wang) gid=2003(wang) groups=2003(wang) 密碼爲:FEaLPYTT
5、編寫生成腳本基本格式的腳本,包括作者,聯繫方式,版本,時間,描述等
[root@centos6 ~]#cat .vimrc
set ignorecase
set cursorline
set autoindent
autocmd BufNewFile *.sh exec ":call SetTitle()"
func SetTitle()
if expand("%:e") == 'sh'
call setline(1,"#!/bin/bash")
call setline(2,"#")
call setline(3,"#********************************************************************")
call setline(4,"#Author: Doonker")
call setline(5,"#QQ: 2719683191")
call setline(6,"#Date: ".strftime("%Y-%m-%d"))
call setline(7,"#FileName: ".expand("%"))
call setline(8,"#URL: http://www.magedu.com")
call setline(9,"#Description: The test script")
call setline(10,"#Copyright (C): ".strftime("%Y")." All rights reserved")
call setline(11,"#********************************************************************")
call setline(12,"")
endif
endfunc
autocmd BufNewFile * normal G