2016-09-15 55 views
2

我有一個文件,其中有一些行寫在臨時目錄中。我的目標是提取第二個下劃線和點(。)之間的值。例如,在bash中第二次出現_(下劃線)和點(。)之前提取值

這裏的filesample.txt內容的示例:

--rwxr-x---     235 2016-08-24 05:13 File_Name_2696553.txt 
--rwxr-x---     1274 2016-09-14 04:44 File_Name_2852659.xls 
--rwxr-x---     1802 2016-09-14 05:04 File_Name_2852992.pdf 

我所做的是以下幾點:

cat ${tmp}filesample.txt | cut -b64- | awk -F"." '{ print $1 }' 

這給了我所需的輸出。但是,我認爲更好的解決方案是將代碼放在第二個下劃線和點之間。

這樣,如果每行的內容末尾的7位數字變爲8或更多,我不必回到我的腳本並調整它,因爲cut -b64-正在查看第64位的字節。

這可能是一個基本的問題,我是bash腳本的新手。

回答

3

您可以使用awk

awk '{split($NF, a, "[_.]"); print a[3]}' file 

測試:

$ awk '{split($NF, a, "[_.]"); print a[3]}' file 
2696553 
2852659 
2852992 
+0

使用此解決方案:'awk'{split($ NF,a,「[_。]」);打印一個[3]}'<<<'a.b.c.d_123_xyz.jpg''將返回'c',但我相信OP正在尋找'xyz' – anubhava

2

要獲得第二_和明年DOT之間的值,你可以使用:

awk '{split($NF, a, /_/); sub(/\..*/, "", a[3]); print a[3]}' filesample.txt 

2696553 
2852659 
2852992 
  • 使用split功能,我們通過_(下劃線)拆分最後提交併採取a[3]這是後第二_
  • 值然後使用sub功能我們去掉一切DOT後,從而使我們的第二_和明年DOT
  • 之間的值
+0

這條線是幹什麼的?你可以解釋嗎? – lonerangerdeveloper

+0

在答案中添加了解釋。 – anubhava

1
$ cat ip.txt 
--rwxr-x---     235 2016-08-24 05:13 File_Name_2696553.txt 
--rwxr-x---     1274 2016-09-14 04:44 File_Name_2852659.xls 
--rwxr-x---     1802 2016-09-14 05:04 File_Name_2852992.pdf 

$ grep -oP '.*_\K\d+' ip.txt 
2696553 
2852659 
2852992 
  • o只輸出匹配的文本
  • 基於使用Perl正則表達式
  • .*_匹配文本高達_在貪婪方式
  • \K使用正回顧後,匹配的文本,直到然後將不輸出的一部分
  • \d+一個或多個數字
0

一個小嚐試使用bashregex比賽

$ while read -r line; do [[ $line =~ _([[:digit:]]{7,}). ]] && \ 
    NUM=${BASH_REMATCH[1]}; echo $NUM; done < <(awk '{print $5}' file) 

2696553 
2852659 
2852992 

對於INP UT file作爲

--rwxr-x---     235 2016-08-24 05:13 File_Name_2696553.txt 
--rwxr-x---     1274 2016-09-14 04:44 File_Name_2852659.xls 
--rwxr-x---     1802 2016-09-14 05:04 File_Name_2852992.pdf 
2

隨着SED:

$ sed 's/.*_\([^.]*\).*/\1/' filesample.txt 
2696553 
2852659 
2852992 

它捕獲並輸出最後下劃線和最後的點之間的值。

1
awk -F'[_.]' '{print $(NF-1)}' file 

2696553 
2852659 
2852992 
+1

讓我們改進:)然後! –

相關問題