重定向
什么是重定向?
將原本要輸出在屏幕中的內容,重新定向輸出到指定的文件或設備中。
** 為什么要使用重定向?**
1.備份時,我們需要知道備份的結果
2.屏幕上輸出信息,比較重要的時候,我們想要保存下來
3.定時任務,我們需要知道結果
4.執行命令時,明知道會報錯,我們會使用重定向,將結果 放入 /dev/null
5.執行命令時,正確 結果和錯誤 結果會同時輸出,將正確結果輸出到常規日志,將錯誤結果輸出到錯誤日志
重定向的分類
- 標准輸入
- 標准輸出
名稱 | 文件描述符 | 作用 |
---|---|---|
標准輸入(stdin) | 0 | 通常鍵盤(其他輸入命令的終端設備) |
標准輸出(stdout) | 1 | 默認輸出到屏幕 |
錯誤輸出(stderr) | 2 | 默認輸出到屏幕 |
文件名(filename) | 3+ | - |
[root@localhost ~]# ll /dev/std*
lrwxrwxrwx 1 root root 15 3月 25 10:36 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 3月 25 10:36 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 3月 25 10:36 /dev/stdout -> /proc/self/fd/1
[root@localhost ~]# ll /proc/121169/fd/
總用量 0
lrwx------ 1 root root 64 4月 7 11:28 0 -> /dev/pts/3
lrwx------ 1 root root 64 4月 7 11:28 1 -> /dev/pts/3
lrwx------ 1 root root 64 4月 7 11:27 2 -> /dev/pts/3
lr-x------ 1 root root 64 4月 7 11:28 3 -> /var/log/messages
輸出重定向
/dev/null
/dev/pts/0
/dev/pts/1
/tmp/zls.txt
/root/1.txt
類型 | 符號 | 用途 | 備注 |
---|---|---|---|
標准覆蓋輸出重定向 | 1> | 將命令執行的正確結果默認輸出的位置,修改為指定的文件或者終端(覆蓋原有內容) | 通常'>'即可,1可以不寫,默認就是1 |
標准追加輸出重定向 | >> | 將命令執行的正確結果,輸出到指定文件的末尾(不覆蓋原有內容) | - |
錯誤覆蓋輸出重定向 | 2> | 將命令執行的錯誤結果默認輸出的位置,修改為指定的文件或者終端(覆蓋原有內容) | - |
錯誤追加輸出重定向 | 2>> | 將命令執行的錯誤結果,輸出到指定文件的末尾(不覆蓋原有內容) | - |
標准輸入重定向 | 0< | 將命令中接收輸入內容由默認的鍵盤,改為命令或者文件 | 通常'<'即可0可以寫也可以不寫,默認0 |
標准輸入追加重定向 | 0<< | 將命令中接收輸入內容由默認的鍵盤,改為命令或者文件 | - |
# 標准覆蓋輸出重定向
[root@localhost ~]# echo wxx>/tmp/1.txt
[root@localhost ~]# cat /tmp/1.txt
wxx
[root@localhost ~]# echo 321>/tmp/2.txt
[root@localhost ~]# cat /tmp/2.txt
[root@localhost ~]# echo wxx1>/tmp/3.txt
[root@localhost ~]# cat /tmp/3.txt
wxx1
**標准追加輸出重定向**
標准追加輸出重定向
[root@localhost ~]# echo 456 >> /var/log/messages
[root@localhost ~]# echo 123 >> /var/log/messages
**錯誤輸出重定向**
錯誤輸出重定向
[cdx@localhost ~]$ find /etc/ -type d
**將標准輸出和錯誤輸出都輸出到相同的文件中**
將標准輸出和錯誤輸出都輸出到相同的文件中
[cdx@localhost ~]$ find /etc/ -type d > /tmp/100.txt 2>&1
[cdx@localhost ~]$ find /etc/ -type d &> /tmp/101.txt
**將錯誤輸出,重定向到黑洞**
將錯誤輸出,重定向到黑洞
[root@localhost ~]# ls / /ooo 2>/dev/null
**腳本中使用重定向**
腳本中使用重定向
!/bin/bash
. /etc/init.d/functions
read -p "請輸入要檢測的IP:" IP
ping -c1 -W1 $IP &>/dev/null
if [ \(? -eq 0 ];then action "\)IP" /bin/true >> /tmp/IP_OK.txt
else
action "$IP" /bin/false >> /tmp/IP_FAILD.txt
fi
輸入重定向
[root@localhost ~]# mail -s "$(date +%F-%T)_test" 11111@qq.com < /etc/passwd
[root@localhost opt]# echo -e "111\n222\n333" > file1.txt
[root@localhost opt]# cat file1.txt
111
222
333
[root@localhost opt]# echo '
1111
2222
3333
4444
' > file2.txt
[root@localhost opt]# cat >> 1.txt <<EOF
> aaa
> bbb
> ccc
> ddd
> EOF
[root@localhost opt]# cat >> 2.txt
111
222
333
444
Ctrl + d 結束
cat <<EOF
+--------------------------+
| vmware manager |
+--------------------------+
| by wxx |
+--------------------------+
| 1. Install KVM |
| 2. Install or Reset C6.5 |
| 3. Install or Reset C7.4 |
| 5. Instqll or Reset W7 |
| 6. Remove all |
| q. quit |
+--------------------------+
EOF
[root@localhost opt]# cat <<EOF
> 1.install mysql
> 2.install nginx
> 3.intsall php
> 4.install tomcat
> 5.install redis
> EOF
1.install mysql
2.install nginx
3.intsall php
4.install tomcat
5.install redis
# 兩條命令同時重定向
[root@localhost opt]# (ls ; date) > 1.txt
(while :; do date; sleep 2; done) &>date.txt &
#如果不希望某些命令的執行對當前 shell 環境產生影響,請在subshell中執行
[root@localhost ~]# (cd /boot; ls)
管道技術
管道操作符號:|
,叫做管道符
作用:將管道符左邊命令的標准輸出,交給管道符右邊命令的標准輸入來處理
用法:cmd1|cmd2|cmd3| cmd4...
# 取出passwd文件中,uid最大的前五個
[root@localhost ~]# sort -nr -k 3 -t ':' /etc/passwd|head -5
# 統計出passwd文件中,所有用戶的shell種類
[root@localhost ~]# awk -F: '{print $7}' /etc/passwd|sort |uniq|wc -l
6
[root@localhost ~]# hostname -I
10.0.0.200
[root@localhost ~]# ifconfig |awk 'NR==2{print $2}'
10.0.0.200
sed
awk
grep
組合:sed awk
grep awk
10種方法,取IP
# 取出 磁盤已使用 百分比
[root@localhost ~]# df -h|awk '{print $5}'|awk -F '%' '{print $1}'
已用
9
0
0
1
0
24
5
0
1
# tee 和 重定向的區別
tee會將輸出結果顯示在屏幕上
[root@zls ~]# date > date.txt
[root@zls ~]# date |tee date.txt
#xargs:將管道前面的結果當成管道后面命令的參數
[root@localhost opt]# find /etc/ -name '*.conf'|xargs cp -t /tmp/
十種方式取ip
十種方法取ip
[root@wzh ~]# ifconfig|awk 'NR==2 {print $2}'
10.0.0.200
[root@wzh ~]# ifconfig|sed -nr '2s#.*et (.*) ne.*#\1#gp'
10.0.0.200
[root@wzh ~]# ifconfig|grep -w 'broadcast'|cut -d ' ' -f10
10.0.0.200
[root@wzh ~]# ifconfig|sed -n '2p'|awk '{print $2}'
10.0.0.200
[root@wzh ~]# ifconfig|grep -w 'broadcast'|sed -r 's#.*et (.*) ne.*#\1#g'
10.0.0.200
[root@wzh ~]# ifconfig |head -2|tail -1|cut -d ' ' -f10
10.0.0.200
[root@wzh ~]# ifconfig|grep -w 'broadcast'|cut -c 14-24
10.0.0.200
[root@wzh ~]# ifconfig|awk 'NR==2'|cut -d 't' -f2|cut -d 'n' -f1
10.0.0.200
[root@wzh ~]# ifconfig|sed -n '2p'|grep -o '[0.-9]*'|head -1
10.0.0.200
[root@wzh ~]# ifconfig|sed -n '2p'|cut -d ' ' -f10
10.0.0.200
練習題
01.復制/etc/passwd文件到當前目錄下,把文件中的:替換成#,不能使用sed和vim命令。
cp /etc/passwd ./
tr ':' '#' < ./passwd
02.改變文件所有者的命令是?
chown
03.新建一個1.txt文件,文件內容如下
[root@centos7 ~]# cat >>1.txt <<eof
> 1123
> 1122
> 112233
> 321
> 3306
> 8080
> 80
> 23
> 21
> 8081
> 8082
> 8085
> eof
1123
1122
112233
321
3306
8080
80
23
21
8081
8082
8085
04.接03題,顯示1.txt第3行到第10行的內容(三種方法)
[root@centos7 ~]# head 1.txt|tail -7
[root@centos7 ~]# awk 'NR==3,NR==10' 1.txt
[root@centos7 ~]# sed -n '3,10p' 1.txt
05.接03題,顯示1.txt第3行和第10行的內容(兩種方法)
[root@centos7 ~]# awk 'NR==3;NR==10' 1.txt
[root@centos7 ~]# sed -n '3p;10p' 1.txt
06.執行命令echo "I am qiandao,my qq is 1716141363">/oldboy/oldboy.txt,
[root@wzh ~]# echo "I am qiandao,my qq is 1716141363">/oldboy/oldboy.txt
[root@wzh ~]# cat /oldboy/oldboy.txt
I am qiandao,my qq is 1716141363
現在需要從文件中過濾出“qiandao”和“1176494252”字符串,請給出命令?(最少三種方法)
[root@wzh ~]# egrep -o 'qiandao||1716141363' /oldboy/oldboy.txt
qiandao
1716141363
[root@wzh ~]# awk -F '[ ,]' '{print $3,$7}' /oldboy/oldboy.txt
qiandao 1716141363
[root@wzh ~]# sed -r 's#.*am (.*)(,.*)s(.*)#\1\3#g' /oldboy/oldboy.txt
qiandao 1716141363
07.接上題,如果需要從文件中過濾出“qiandao,1176494252”字符串,請再給出命令?
[root@wzh ~]# egrep -o 'qiandao,|1716141363' /oldboy/oldboy.txt
qiandao,
1716141363
08.用什么命令可以測試另外一台服務器的某個端口是打開的
telnet
09.簡述 > 和 >> 符號作用,以及兩個符號之間區別
1.> 輸出重定向符號 作用:將前面的內容輸出到文件中並且覆蓋原文件內容
2.>> 追加重定向符號 作用:在原有文件的基礎上追加新內容
區別>會覆蓋原文件>>是追加在文件底部不覆蓋
10.vim中把所有的oldboy替換為oldgirl 給出命令
:%s#oldboy#oldgirl#g
11.管道符號的含義說明 |
作用:將管道符左邊命令的標准輸出,交給管道符右邊命令的標准輸入來處理
12.如何創建一個系統用戶,創建完成如何進行切換用戶,切換完畢如何確認查看
[root@wzh ~]# useradd w
[root@wzh ~]# su - w
虛擬機ip 10.0.0.200
[w@wzh ~]$ whoami
w
13.如何實現每次系統啟動自動備份/oldboy/oldboy.txt文件,並且備份操作完在/oldboy/info.log中有備份操作提示信息
vim /etc/rc.local
\cp /oldboy/oldboy.txt{,.bak} && echo oldboy.txt back is ok >> /oldboy/info.log
14.查找/app/logs下7天以前的log文件並刪除(請使用xargs)
find /app/logs/ -type f -mtime +7 |xargs rm -f
15.將/etc目錄下大於100k的文件移動至/tmp下 (請使用xargs)
find /etc/ -type f -size +100k|xargs -i mv {} /tmp/
16.如何查看/var/log/目錄下的文件數
find /var/log/ -type f |wc -l
17.硬鏈接可以作為源文件的備份文件,為什么還要cp命令進行備份(說明硬鏈接原理)
相同inode號的文件互為硬鏈接
cp是兩個文件,硬鏈接實際是一個文件
18.linux系統中文件屬性信息都包含什么
inode節點號
文件類型和權限
硬鏈接數
屬主和屬組
文件的大小
最后修改時間
文件或目錄名
19.請說明利用管道命令和xargs命令結合是, 命令執行的原理過程
xargs將參數列表轉換成小塊分段傳遞給其他命令
讀入stdin的數據轉換為參數添加至命令后面
讓一些不支持管道的命令可以使用管道
| 把前面命令的標准輸出交給管道后面命令的標准輸入
20.如何創建一個新的oldgirl用戶,並且需要給用戶設置密碼,並且采用免交互方式創建密碼
useradd oldgirl
echo '123'|passwd --stdin oldgirl
21.把/etc/passwd文件中的第5到第15行的內容保存到/oldboy/test.txt中,(不低於三種方法)
mkdir /oldboy
touch /oldboy/test.txt
awk 'NR==5,NR==15' /etc/passwd > /oldboy/test.txt
sed -n '5,15p' /etc/passwd > /oldboy/test.txt
head -15 /etc/passwd|tail -10 > /oldboy/test.txt
22.說一說你知道的vim里面的命令並寫出意思。(不低於10個)
gg :將光標移動到文件的開頭 ,ngg就是移至n行行首
dd : 刪除一行,(刪除多行 ndd dnd :n為數字 + p = 剪切)
D : 將光標之后的內容都刪除
u : 撤銷
$(shift+4) : 將光標移動至行尾
^(shift+6) : 將光標移動至行首
dG : 刪除光標以下的所有內容(包括光標所在行)
yy : 復制,復制n 行,nyy ,yny
p : 粘貼(光標所在行的下一行)
R : 多個字符替換(按ESC退出替換)
23.刪除oldboy.txt文件中的所有空行,有的空行里面存在tab鍵和空格(兩種方法)
sed -ri '/^[ \t]*$/d' oldboy.txt
awk '!/^[ \t]*$/' oldboy.txt
24.快速返回到上一次所在的目錄的命令為(cd - )
25.給test.sh文件加上執行權限
touch test.sh
chmod +x test.sh
26.將/home/stud1/wang目錄做歸檔壓縮,壓縮后生成wang.tar.gz文件,並將此文件保存到/home目錄下,實現此任務的tar命令格式
將/home/stud1/wang目錄做歸檔壓縮,壓縮后生成wang.tar.gz文件,並將此文件保存到/home目錄下,實現此任務的tar命令格式
27.用shell在/usr/local下建立20個子目錄xunlei1-xunlei20,再在這個子目錄下分別建255個子目錄dir1-dir255再在255個子目錄下創建10000個文件xunlei1.html-xunlei10000.html
mkdir -p /usr/loca/xunlie{1..20}/dir{1..255}/
touch /usr/loca/xunlie{1..20}/dir{1..255}/xunlei{1..10000}.html
28.linux如何得知服務器的的運行時長?
uptime
29.rm命令修改了別名信息的文件/etc/profile,但還是不能直接刪除信息,是什么原因,並寫出和別名設置相關的文件及路徑信息
家目錄中的文件配置優於/etc目錄文件的配置
/etc/profile
/etc/bashrc
設置別名或變量可以全局生效
~/.bash_profile
~/.bashrc
設置別名或變量只是相應用戶生效
在家目錄中有文件中設置了別名
/etc/profile -->/etc/bashrc-->~/.bashrc--> ~/.bash_profile
30.linux運維工程師都需要具備哪些職業素質?
人品
7*24
持續學習