Linux 基礎命令知識1

生成空白文件

touch c.txt

去掉字符串前後空格

echo "    a bc    " | awk 'gsub(/^ *| *$/,"")'

計算變量的length長度:

var="abc";echo ${#var}

查看進行Id

pgrep java

查看進行環境變量

cat /proc/${pid}/environ

超級用戶的$UID 爲0

if [ $UID -nq 0 ] ;then echo "Not su";fi;

Shell 中字符串進行數學運算,使用let 、 []、 (()) 、 expr

num1=5;num2=5;let result=num1+num2;echo $result;
result=$[ num1 + num2 ]
result=$[ $num1 + 4 ]
result=$(( num1 + num2 ))
resutl=`expr 3 + 4`
result=$(expr $num1 + 4)
#自加 自減 簡寫形式
let num1++; let num1--;  let num1+=4;

#########以上運算方法不支持浮點數運算
我們可以使用BC來做浮點數等精密運算
echo "4 * 0.56" | bc
通過scale設置小數位個數
echo "scale=2;3/8" | bc
計算平方根
echo "sqrt(100)" | bc
echo "10^10" | bc
進制轉換:
echo "obase=2;100"|bc
echo "obase=8;100"|bc

命令:tee Copy standard input to each FILE, and also to standard output.

cat a.txt | tee -a copy.txt | cat -n # tee -a 表示是末尾追加不會覆蓋 , cat -n 輸出行號
ls | cat -n  > out.txt # ls 結果輸出給cat 

數組和關聯數組

array_var=(1 2 4 5) # 注意是以空格分隔
echo ${array_var[0]} # 輸出第一個值
echo ${array_var[*]} #輸出整個數組的值
echo ${array_var[@]} #輸出整個數組的值
echo ${array_var[$index]}
echo ${#array_var[*]} #輸出數組長度

關聯數組 , key-value

declare -A ass_array
ass_array=([index1]=value1 [index2]=value2) #定義的時候賦值
ass_array[index1]=value1
echo ${ass_array[index1]}

格式輸出系統當前時間點

echo $(date "+%Y-%m-%d %H:%M:%S")

Shell函數定義

function fname(){
 echo $1 ,$2 # 訪問參數
 echo "$@" #打印所有參數
 echo "$*" #打印所有參數
 
 return 0; #返回值
}

方法調用
fname arg1 arg2

利用IFS變量分割行,答應出系統用戶和用戶目錄

oldIFS=$IFS
IFS=":"
while read line ;
do 
     count=0
     for item in $line;
     do 
          [ $count -eq 0 ] && user=$item
          [ $count -eq 5 ] && homedir=$item
          let count++
     done;
     echo $user"   "$homedir
done</etc/passwd; 
IFS=$oldIFS

#For循環的使用
for((i=0;i<10;i++));do echo $i;done;
for((i=0;i<10;i++)){ echo $i;}
for i in {1..10};do echo $i;done;

Shell 算術比較

#算術比較一般放在[]中括號中, 需要注意的是在操作符和操作數之間存在一個空格,如果忘記空格會報錯。
var=10;[ $var -eq 10 ] or [ $var -lt 20 ] && echo $var;
result: 10
#邏輯與 -a
[ $var -ne 10 -a $var -lt 20 ]
#邏輯或 -o
[ $var -ne 0 -o $var -gt 2 ]
-gt:大於
-lt:小於
-ge:大於等於
-le:小於等於
-eq:等於

文件系統相關測試

[ -f $file_var ] #如果給定變量包含正常文件路徑或者文件名,則返回true
[ -x $file_var ] #如果給定文件可以執行則返回True
-d: 判斷目錄
-e: 文件存在
-w:文件可寫
-r: 文件可讀

Demo:
file_path="/etc/passwd";if [ -e $file_path ];then echo File exist;fi; [ -x $file_path ] && echo ~;

字符串比較

字符串進行比較時最好使用雙括號,因爲有時候採用單個括號會產生錯誤。
[[ $str1 = $str2 ]] :判斷兩個字符串是否相等 同樣可以使用兩外一箇中法 [[ $str1 == $str2 ]]
demo:
str1="xueping.you";str2="xueping.you"; [[ $str1 = $str2 ]] && echo equal; [[ $str1 != 'test' ]] && echo not equal;
其他:
[[ $str1 > $str2 ]]
[[ -z $str1 ]] :判斷是否是空字符串,返回真
[[ -n $str1 ]] : 如果str1是非空字符串,返回真

find 命令的使用

find . -print # 打印文件和目錄中的列表
-name:根據文件名或者正則表達式匹配搜索
demo: find . -name 'export*' -print
-iname: 忽略大小寫
find 匹配多個條件,可以使用Or 或者 And
demo:find . \( -name "*.txt" -o -name "*.csv" \) -print   # \( .....\) find 會將這個視爲一個整體

-path: 匹配文件路徑
demo: find . \( -path "*ticket*" \) -print
result:
./ticket
./ticket/saveOrderNo.txt_cp
./ticket/ticket_merchantCodeOfOnceDay.txt
./ticket/supplierId_amount_file.csv
./ticket/recharge.20160623.md5
./ticket/bill_settle_bill_no.txt
./ticket/balance.txt
./ticket/bill_detail_order_no.txt
./ticket/uniq_key.csv
./ticket/recharge.20160623.txt
./ticket/balanceOrderNo.txt
./ticket/saveOrderNo.txt
./ticket/result_cp.txt
./tuan_ticket.csv

-regex:類似於-path ,不同點是-regex使用的是正則表達式來匹配路徑
demo:find . \( -regex ".*ticket.*" \) -print # 輸出和上面demo輸出一致

否定參數:
find可以用“!”否定參數的含義。例如:
demo:find . ! \( -regex ".*ticket.*" \) -print

-maxdepth:搜索的最大深度
-mindepth:搜索的最小深度
-type :搜索的文件類型  d,只列出目錄  f,只列出文件 l,只列出鏈接
demo: find . -maxdepth 2 -regex ".*ticket.*" -type f -print

#UNIX|LINUX文件系統中的每個文件都有三種時間戳,-atime 用戶最近一次的訪問時間 -mtime 文件最後一次修改的時間  -ctime 文件數據源最後一次變更(權限或所有權)的時間

find . -type f -atime -7 -print #-表示小於 + 表示大於 單位爲天
#-amin -mmin -cmin 單位基於秒
#-newer 我們可以用於指定一個參考文件,find找出所有比參考文件更新的文件
#-size 指定文件大小(單位:c k M G) -size +2K (大於)| -size -2K (小於)| -size 2K (等於)
find . -type f -newer file.txt -print

#-delete 刪除匹配的文件
find . -type f -name "*.swap" -delete

xargs的使用

xargs 用於將stdin接收的數據重新格式化,再將其作爲參數提供給其他命令。
#合併多爲爲單行
demo:
cat testinput.txt 
1 2 3 4
5
6

7 8
cat testinput.txt | xargs 
1 2 3 4 5 6 7 8

cat testinput.txt | xargs -n 2 # -n用於指定每行最大個數
1 2
3 4
5 6
7 8

echo "xuepingyou,xiaoming,langlang" | xargs -d "," -n 1 #-d 用於指定一個定界符
xuepingyou
xiaoming
langlang

tr命令的使用方法

#tr對來自標準輸入的字符進行替換,刪除和壓縮,tr只能通過stdin 而無法通過命令行參數接收輸入。
#執行方式: tr [option] set1 set2
echo "HELLO WHO IS THIS" | tr 'A-Z' 'a-z' #大寫轉換爲小寫
#簡單的加密和解密:
echo 12345 | tr '0-9' '9876543210'
87654
echo 87654 | tr '9876543210' '0-9'
12345

#用tr刪除字符
echo "Hello 123 world 345" | tr -d '0-9'

#用tr壓縮字符
echo "GNU is    not  UNIX . Recursive  right ?" |tr -s ' '
GNU is not UNIX . Recursive right ?


sort 、uniq 命令使用 ,這兩個命令一般情況下會搭配使用

simple demo:cat test.txt |sort |uniq #排序去重
sort -n file.txt #按照數字進行排序
sort -r file.txt #逆序排序
cat test.txt | sort -n -r
124
33
24
13
12
1
#可以使用sort檢查文件是否已排序
sort -nrC test.txt.sort ; if [ $? -eq 0 ];then echo sorted;else echo Unsorted;fi;
sorted

sort -C test.txt.sort ; if [ $? -eq 0 ];then echo sorted;else echo Unsorted;fi;
Unsorted

#-k指定了排序應該按照哪一個key來進行排序,建指的是列號。
sort -nrk 1 data.txt
#多行作爲key
sort -nrk 1,2 data.txt

sort -u unsorted.txt #只顯示唯一的行
sort unsorted.txt | uniq -u #效果和上一個命令效果一樣
sort unsorted.txt | uniq -c #統計各行重複的次數
sort unsorted.txt | uniq -d #找出重複的行


分割文件和數據

#生成一個大小爲100kb的測試文件
dd if=/dev/zero bs=100k count=1 of=data.file

spilt -b 10k data.file

根據擴展名切分文件名

#藉助%操作分來分離出"名稱.擴展名"這種格式的文件名 
ls | while read line;do name=${line%.*};echo $name;done;
#"%"從左向右通過非貪婪找到最短的匹配結果。 "%%"則是通過貪婪查找
var="home.work.txt";echo ${var%.*};
home.work
var="home.work.txt";echo ${var%%.*};
home

#藉助"#"操作符提取出文件名的擴展名
ls | while read line;do name=${line#*.};echo $name;done;
# "#"從左到右刪除 "##""%" "%%"規則一直

文件之間的比較命令:comm

 comm a.txt b.txt #第一列是a中出現的,第二列是b中出現的,第三列是a和b中相同的列
a
		b
		c
	d
#-1 從輸出中刪除第一列
#-2 從輸出中刪除第二列
#-3 從輸出中刪除第三列
comm a.txt b.txt -1 -2
b
c


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章