最近比較有空,偶爾又來寫點文件好了 (被主管發現就不好了,偷偷的把時間改成下班時間寫的...科科)
在ptt的linuxDev版,看到有人在求救這樣子的問題,那我也花時間研空了一下怎用
如果今天有個檔案,如 a.txt 的內容如下:
第零行
第一行
第二行
第三行
第四行
第五行
第六行
.....
第十行
今天我想用一行shell script,來抽出我要哪些行數,怎麼作呢?
比如我只要印出
第二行
第三行
第四行
也許有些老手,知道怎麼用 head+tail去抓這樣的內容
# head a.txt -n5|tail -n 3
這樣的指令可以印出
[root@localhost tmp]# head a.txt -n5|tail -n 3
第二行
第三行
第四行
看起來是還不錯,那麼,用 sed 怎用呢~
# sed -n 3,5p a.txt
[root@localhost tmp]# sed -n 3,5p a.txt
第二行
第三行
第四行
呵~這樣的問題上google其實還滿好找的,但問題總是會一摎延延延伸啊~~~
有人的野心比較大,想要查 2~5行,又要查 7~10行,然後一起印
所以就研究了下面的方法了...
[root@localhost tmp]# _TMP='3,6p 8,11p'; for i in $_TMP;do sed -n $i a.txt; done
第二行
第三行
第四行
第五行
第七行
第八行
第九行
第十行
可是這樣的寫法,總有一天會遺忘啊...而且有發現 sed 給的行數都要加1,看的有點不太習慣,我就寫了支 php
的小檔,作成處理此功能的函式~
請將以下的內容存到 /usr/bin/3wa_file_readline.sh
#!/usr/bin/env php
if($argc==1||$argc[2]=='-h')
{
echo "\n
這支程式可以讀檔案,並且指定行數呦~\n
使用方法如下:\n\n
# {$argv[0]} [file] [pn,pn] [pn,pn]\n\n
如這個範例:\n\n
# {$argv[0]} /etc/passwd 1,3 7,10\n\n
3WA 問題解決專家工作室\n\n";
exit(0);
}
if(file_exists($argv[1])==false)
{
echo "\n檔案不存在Orz\n";
exit(1);
}
$d=explode("\n",file_get_contents($argv[1]));
for($i=2;$i<$argc;$i++){
$p=explode(',',$argv[$i]);
if($p[0]>=$p[1])
{
$p[0]^=$p[1];
$p[1]^=$p[0];
$p[0]^=$p[1];
}
for($j=current($p);$j<=end($p);$j++)
{
echo $d[$j]."\n";
}
}
?>
試玩看看~
[root@localhost tmp]# chmod +x /usr/bin/3wa_file_readline.sh
[root@localhost tmp]# 3wa_file_read_line.sh
這支程式可以讀檔案,並且指定行數呦~
使用方法如下:
# /usr/bin/3wa_file_read_line.sh [file] [pn,pn] [pn,pn]
如這個範例:
# /usr/bin/3wa_file_read_line.sh /etc/passwd 1,3 7,10
3WA 問題解決專家工作室
[root@localhost tmp]# 3wa_file_read_line.sh a.txt 3,5
第三行
第四行
第五行
[root@localhost tmp]# 3wa_file_read_line.sh a.txt 3,5 6,7 1,2
第三行
第四行
第五行
第六行
第七行
第一行
第二行
啊~沒裝php就沒辦法嘍^^"