❶ shell腳本如何刪除指定字元串,文檔如下:
用正則匹配就可以了。
shell腳本regex正則表達式 和 字元串替換
任意字元
^行首匹配
$行尾匹配
^$表示空行,不含字元的行
^
$匹配只有單個空格的行
[0-9]
[a-zA-Z]
^[A-
Z]搜索以大寫字母開頭的行
[^A-Z]匹配大寫字母意外的任意字元
*表示匹配0個或若干個字元,如:a*,表示匹配0個或若干個a;
aa*表示匹配至少1個a
.*來表示0或若干個任意字元
e.e*表示匹配第一個e和最後一個e之間的任意字元
[-0-9]匹配一
個連字元或數字
[]a-z]匹配一個]或者字母
\{min,max\}匹配任意數目的字元串
[a-z]\{10\}只匹配10個
a-z字元的字元串
s/.\{5\}$// 刪除每行的最後5個字元
\(...\),n是1到9的數字,表示存儲用的寄存器,用\n來引
用存在寄存器中的內容
^\(.\)\1匹配行首的第一個字元,並將該字元存到1號寄存器中,然後匹配1號寄存器中的內容,這由\1的描述。該正則
表達式的最終效果是,如果一行的頭兩個字元相同,就匹配他們。
^\(.\).*\1$匹配一行中的頭一個字元(^.)跟最後一個字元(\1$)相
同的行。.*匹配中間的所有內容
^\(...\)\(...\)行中頭三個字元存在1號寄存器,接著的三個字元存在2號寄存器.
s/\(.*\)
\(.*\)/\2 \1/g 交換兩個欄位
.任何字元
^行首
$行尾
*前導的正則表達式重復0或若干次
[字
符表]字元中的任一字元
a..表示a後的2個字元
^wood表示行首的wood
x$表示行為的x
^INSERT$只包含
字元串INSERT的行
^$不包含任何字元的行
x*表示0或若干個連續的x
xx*表示1或多個連續的x
.*表示0活若干
個字元
w.*s表示以w開始,s結尾的任何字元串
[tT]小寫或大寫的t
[^字元表]表示任一不在字元表中的字元 [^0-9]
[^a-zA-Z]
\{min,max\}表示前導的正則表達式重復只燒min次,至多max次[0-9]\{3,9\}表示3到
9個數字
\(...\)表示將小括弧中匹配的字元串存儲到下一個寄存器中(1-9),
^\(.\)表示行中第1個字元存到1號寄存器
^\
(.\)\1表示行首戀歌字元,且他們相同
cut -c5 file把file文件中沒行的第5個字元析取出來;
用逗號分割的數
值列表,如-c1,13,50把第1,13,50個字元析取出來
cut -c20-50把第20到50之間的字元析取出來
如
who | cut
-c1-8
who | cut -c1-8,18- 析取行中的第1到8個字元(用戶名)和第18到行尾的字元(登錄時間)
cut -ddchar
-ffields file其中,dchar是數據中分割各欄位的分割符,fields表示要從文件file中析取出來的欄位.
字
段編號從1開始,而且格式跟以前將的用來指定字元位置的數字一樣(如-f1、2、8、-f1-3、-f4-)。
cut -d: -f1
/etc/passwd
如果已知欄位之間使用製表符分隔的,就可以給cut命令用-f選項而不用-c選項,好多了!還記得吧,這里用不著用-d選
項來指定分割符,因為
cut把製表符默認為分割符。
paste和cut正好相反,它不是把行分離開,而是把多行合並在一起。
paste
names numbrs文件names中的每一行都和numbers中的對應行顯示在一起,中間用製表符分割。
如果不想用製表符作默認分割,
可以使用-dchars指定分割符
paste -d'+' names addresses numbers
-s選項告訴paste把同
一文件中的行粘貼在一起,而不是從其他文件。如果只指定一個文件名,其效果是把文件中的所有行合並成一行,原來隔行之間用製表符或者有-d選項指定的分割
符分割。
sed是用來編輯數據的程序,意指流編輯器(stream editor)。與ed不同,sed不能用於交互,
-n選
項,然後使用p命令顯式指定
sed -n '1,2p' file只顯示前2行
sed -n '/Unix/p'
file只列印包含Unix的行
刪除行
d刪除整行文件
sed '1,2d' file刪除1和2行
記住sed默認把輸入
的所有行寫入標准輸出,所以生於行的文字,也就是從第3行到結尾,都被寫入標准輸出。
sed '5d'刪除第5行
sed
'/[Tt]est/d'刪除包含test或Test的行
sed -n '20,25p' test只顯示文件test的第20行到第25行
sed
'1,10s/unix/UNIX/g' intro報intro前10行中的unix改為UNIX
sed
'/jan/s/-1/-5/'將所有包含jan的行中第1個-1改為-5
sed 's/...//'
data刪除data文件每一行的前3個字元
sed 's/...$//' data刪除data文件每一行的最後3個字元
sed -n 'I'
text顯示文件text的所有行,把所有不可列印字元顯示為\nn,製表符顯示為\t
過濾器tr用來轉換來自標准輸入的字
符,tr命令的一般格式為
tr from-chars to-chars
tr e x <
intro把所有字母e轉換成x
tr命令的輸入必須重定向到文件intro,因為tr總是從標准輸入獲得輸入;轉換的結果寫入標准輸出,而原始文
件保持不變。
cut -d: -f1,6 /etc/passwd | tr : ' '
通過在管道線的最後加上適當的tr命令,就可以把冒號轉換成製表符,這樣產生的輸出更容易看
單引號中括的是製表符(盡管你看不到)。必須將它括在
引號中,以便穿過shell,使tr有機會看到它。
使用\nnn來給tr提供8進製表示的字元
一些ascii字元的八進制值
響 鈴
7
退格 10
製表符 11
新行 12
換行 12
換頁 14
回 車
15
轉義 33
date | tr ' ' '\12'此例中,tr接受date命令的輸出,並把所有的空格轉換成換行
tr
'[a-z]' '[A-Z]'
<intro將所有小寫轉換為大寫
-s選項,tr命令中的-s選項用來壓縮to-chars中重復的字元,換句話說,如果轉換完成後,有
to-chars中的某個字元連續出現多次,則這些連續相同的字元被替換為一個字元。
如下面的命令將冒號轉換為製表符,並將多個連續製表符替換為
單個製表符:
tr -s ':' '\11\'
tr -s ' ' ' '
<lotspaces通過-s將多個空格全部壓縮為單個空格
-d選項用來刪除掉輸入流中的字元,其一般格式為
tr -d
from-chars任何列在from-chars中的字元都會被從標准輸入中刪除。下例用tr來刪除文件intro中的所有空格:
tr -d ' '
<intro
當然sed 's/ //g' intro也可以得到同樣的效果
tr 'X' 'x' 把大X專成小x
tr '()'
'{}' 把所有左小括弧轉換成左大括弧,右小括弧專成右大括弧
tr '[a-z]' '[A-Z]' 把小寫轉大寫
tr '[A-Z]'
'[N-ZA-M]' 把A-M字母分別專成N-Z把N-Z轉成A-M
tr ' ' ''把所有製表符轉換成空格
tr -s ' '
''把多個空格轉換成單個空格
tr -d '\14' 刪除所有換頁字元(八進制14)
tr -d '[0-9]'刪除所有數字
grep
'[A-Z]' list list中包含一個大寫字母的行
grep '[0-9]' data中包含數字的行
grep '[A-Z]...[0-9]'
list list中包含以大寫字母開始、數字結尾的5個字元組合的行
grep '\.pic$' filelist
filelist中以.pic結尾的行
uniq in_file
out_file該格式中,uniq把in_file復制到out_file,處理過程中,去掉其中的重復行。如果不指定第2個參數out_file,結
果就寫入標准輸出;如果in_file沒有指定,那麼uniq就成了一個過濾器,從標准輸入讀取輸入。
>或<
重定向,覆蓋原有的內容
>>或<< 重定向,想文件末尾追加內容
tee 顯示在終端上的內容存儲到文件 ls |
tee >glx
-d 目錄
-e 存在
-f 普通文件
-r 進程可讀文件
-s 長度不為0
-w
進程可寫文件
-x 可執行
-L 鏈接文件
$# 傳給程序的參數個數,或者執行set命令設置的參數個數
$*
對位置參數等的集中引用
$@ 跟$*相似,區別在於當加入雙引號後("$@"),集中引用位置參數"$1","$2"...等
$0
正執行的程序名
$$ 正執行程序的進程id
$! 最後一個發生後台運行的程序的進程id
$? 最後一個在前台執行的程序的退出狀態
$-
當前有效選項標志
`command`符號之間的內容為需要執行的命令
make -C /lib/moles/`uname -r`/build
M=`pwd`
使用echo可以顯示字元串,但是不能格式化字元串,可以使用printf實現
printf "format" arg1 arg2
...
ln -s from to 把from鏈接到to上,所以to是from的符號鏈接
tree -d只顯示目錄
tree -L
2顯示2級目錄
字元串比較
s1 = s2 s1等於s2
s1 != s2 s1不等於s2
s1
s1不為空
-n s1 s1不為空
-z s1 s1為空
整數比較操作
-eq 等於
-ge
大於或等於
-gt 大於
-le 小於或等於
-lt 小於
-ne 不等於
[ "$x1" = 5 ]字元串比較
[
"$x1" -eq 5 ]整數比較
-a 邏輯與操作
-o 邏輯或操作
command1 &&
command2
則先執行command1,如果返回的退出狀態
為0,則執行command2;如果command1返回的退出狀態非0,則跳過command2
command1 ||
command2
和上邊的&&差不多,只是,僅僅當command1返回非0時,才執行command2
#!/bin/sh
append2=0
include_lib=1
if
[ -f cscope_i ];then
rm cscope_i
fi
for cscope_file in $*; do
if [ -f "$cscope_file" ] || [ -d "$cscope_file" ];then
# if [
$cscope_file = '-a' ];then
# append2=1
# continue
#
fi
#
# if [ $cscope_file = '-n' ];then
#
include_lib=0<F11>
# continue
# fi
if [ "$append2" = "1"
];then
find $cscope_file -maxdepth 1 -name '*.[cChH]' -o -name
'*.[cC][pP][pP]'>>cscope_i
else
find $cscope_file -name
'*.[cChH]' -o -name '*.[cC][pP][pP]'>>cscope_i
fi
else
if [
$cscope_file = '-a' ];then
append2=1
elif [ $cscope_file = '-n'
];then
include_lib=0
else
echo "Error: cannot read file
$cscope_file"
fi
fi
done
if [ -f cscope_i ];then
if [
"$include_lib" = "1" ];then
cscope -bi cscope_i
else
cscope -bki cscope_i
fi
rm cscope_i
fi
#linux(ubuntu)
❷ shell 每行字元串提取第幾位
foriin`catfile.txt`
do
echo${i:6:1}###
done
cut-c7-7file.txt
❸ Shell腳本編程cut -c的問題
1. a.echo $pathName, 輸出pathName變數
b.echo $pathName | cut -c$dirLen-$pathLen 截取pathName中第dirLen到pathLen的字元
c.echo $pathName | cut -c$dirLen-$pathLen | sed 's/\// /g' 把截取出來的字元串中的「/"都換成空格
d.echo $pathName | cut -c$dirLen-$pathLen | sed 's/\// /g' | awk '{print $1}',輸出換成空格後的第一個單詞
e.plogName=`echo $pathName | cut -c$dirLen-$pathLen | sed 's/\// /g' | awk '{print $1}'`,把這個單詞賦值給變數plogName
2.'|' 是管道符,把前一個命令的輸出當成後一個命令的輸入
❹ 如何用shell提取文件中指定的字元串
cut命令
用法: cut 參數 文件名
說明:cut 命令從文件的每一行剪切位元組、字元和欄位並將這些位元組、字元和欄位寫至標准輸出。
參數:
-b :以位元組為單位進行分割。這些位元組位置將忽略多位元組字元邊界,除非也指定了 -n 標志。
-c :以字元為單位進行分割。
-d :自定義分隔符,默認為製表符。
-f :與-d一起使用,指定顯示哪個區域。
-n :取消分割多位元組字元。僅和 -b 標志一起使用。如果字元的最後一個位元組落在由 -b 標志的 List 參數指示的
更多參數請參考:cut - -help
-b用法:
以位元組為單位,指定相應的位元組輸出,由於一個英文字元只佔用一個位元組,所以對英文字元可以與-c等價,但是佔用多個節編碼的字元不適用,比如中文;
文件內容:
$ cat test.txt
1234567890
ABCDEFGHIJ
abcdefghij
hello wrold!
指定文件中每行的第1,3到7個字元輸出:
cut -b 1,3-7 test.txt
134567
ACDEFG
acdefg
hllo w
-n表示1到前n個字元,n-表示從n開始的所有字元
列印前兩個字元和從第8個開始的字元
$ cut -b -2,8- test.txt
12890
ABHIJ
abhij
herold!
中文:
文件內容:
$ cat test1.txt
我們好像在哪見過
你記得嗎?
好像那是一個春天!
❺ 求問:CSHELL用CUT如何把變數里的第一個字元和倒數第一個
再按一下則倒數第二條命令會出現,以此類推。 ... 如果filename 選項沒有被指定,history 命令將用變數HISTFILE 的值來代替。 ... 另外你還可以用特殊的字元來定義你的提示符,下面的列表列出了最常用的特殊字元。 ... 特別地,你能把一個正在運行的進程掛起,稍後再恢復它的運行
❻ 簡單的linux的shell腳本命令問題
把xxx後面那一串兒的單引號換成反引號,就是大鍵盤數字1左邊那個。
❼ linux上使用什麼命令查看當前使用shell的用戶名
who
命令查看在使用的用戶
whoami
命令查看自己是什麼用戶名
❽ shell中統計某個文件中欄位的個數
cut-d'#'-f11.txt|sort|uniq-c
cut-d'#'-f11.txt ##這句話的作用是輸出第一個欄位
cut-d'#'-f11.txt |sort##把輸出的欄位做一個排序
cut-d'#'-f11.txt |sort|uniq-c##計算重復個數,也就是你要的統計結果
這是我這邊的執行結果:
❾ linux shell cut 什麼意思
1、remove sections from each line of files
cut的工作就是「剪」,cut是以每一行為一個處理對象的,這種機制和sed是一樣的。
2、cut命令主要是接受三個定位方法:
a)位元組(bytes),用選項-b,一個空格算一個位元組,一個漢字算三個位元組
date
Tue Jan 3 16:34:27 CST 2017
date|cut -b 25-28
b)、字元(characters),用選項-c,按字元cut相對比較簡單,中文字元和空格都算一個字元。
export LANG=zh_CN
date
2017年 01月 03日 星期二 16:36:36 CST
date |cut -c 5,9,13
年月日
c)、域(fields),用選項-f
以/etc/passwd文件為例:
head -n5 /etc/passwd |cut -d : -f 1,3-5
-d指定域分隔符,-f 指定要剪出哪幾個域,這個與awk的輸出特定欄位功能一樣。
❿ linux中這個命令什麼意思
1.cut -d: -f1 /etc/passwd
解釋:把/etc/passwd中用:分割的第一列列印出來
2.grep root /etc/passwd | cut -d: -f7
解釋:把/etc/passwd中包含root的行的第七列列印出來
3.last | cut -d'' -f1
解釋:last命令列出最後登錄系統的用戶信息, 再用cut命令將last命令輸出的第一列列出來