Linux
遞歸搜尋在第一行包含特定字元串組合的文件
我需要找到在第一行包含以下字元串的所有文件:“StockID”和“SellPrice”。
以下是一些文件範例:
1.csv:
StockID Dept Cat2 Cat4 Cat5 Cat6 Cat1 Cat3 Title Notes Active Weight Sizestr Colorstr Quantity Newprice StockCode DateAdded SellPrice PhotoQuant PhotoStatus Description stockcontrl Agerestricted <blank> 1 0 0 0 0 22 0 RAF Air Crew Oxygen Connector 50801 1 150 <blank> <blank> 0 0 50866 2018-09-11 05:54:03 65 5 1 <br />\r\nA wartime RAF aircrew oxygen hose connector.<br />\r\n<br />\r\nAir Ministry stamped with Ref. No. 6D/482, Mk IVA.<br />\r\n<br />\r\nBrass spring loaded top bayonet fitting for the 'walk around' oxygen bottle extension hose (see last photo).<br />\r\n<br />\r\nIn a good condition. 2 0 <blank> 1 0 0 0 0 15 0 WW2 US Airforce Type Handheld Microphone 50619 1 300 <blank> <blank> 1 0 50691 2017-12-06 09:02:11 20 9 1 <br />\r\nWW2 US Airforce Handheld Microphone type NAF 213264-6 and sprung mounting Bracket No. 213264-2.<br />\r\n<br />\r\nType RS 38-A.<br />\r\n<br />\r\nMade by Telephonics Corp.<br />\r\n<br />\r\nIn a un-issued condition. 3 0 <blank> 1 0 0 0 0 22 0 RAF Seat Type Parachute Harness <blank> 1 4500 <blank> <blank> 1 0 50367 2016-11-04 12:02:26 155 8 1 <br />\r\nPost War RAF Pilot Seat Type Parachute Harness.<br />\r\n<br />\r\nThis Irvin manufactured harness is 'new old' stock and is unissued.<br />\r\n<br />\r\nThe label states Irvin Harness type C, Mk10, date 1976.<br />\r\nIt has Irvin marked buckles and complete harness straps all in 'mint' condition.<br />\r\n<br />\r\nFully working Irvin Quick Release Box and a canopy release Irvin 'D-Ring' Handle.<br />\r\n<br />\r\nThis harness is the same style type as the WW2 pattern seat type, and with some work could be made to look like one.<br />\r\n<br />\r\nIdeal for the re-enactor or collector (Not sold for parachuting).<br />\r\n<br />\r\nTotal weight of 4500 gms. 3 0
2.csv:
id user_id organization_id hash name email date first_name hear_about 1 2 15 <blank> Fairley teisjdaijdsaidja@domain.com 1129889679 John 0
我只想找到包含在第一行的文件:“StockID”和“SellPrice”;所以在這個例子中,我只想輸出 ./1.csv
我設法做到了,但我現在卡住了;(
where=$(find "./backup -type f) for x in $where; do head -1 $x | grep -w "StockID" done
find
+**awk
**解決方案:find ./backup -type f -exec \ awk 'NR == 1{ if (/StockID.*SellPrice/) print FILENAME; exit }' {} \;
如果關鍵詞的順序可能不同 - 將模式替換
/StockID.*SellPrice/
為/StockID/ && /SellPrice/
.在大量文件的情況下,更有效的選擇是(一次處理一堆文件;命令的呼叫總數將遠少於匹配文件的數量):
find ./backup -type f -exec \ awk 'FNR == 1 && /StockID.*SellPrice/{ print FILENAME }{ nextfile }' {} +