shell - python实现把多级目录多个JS文件中包含某字符的字符串提取出来并加上标示存入一个文本文件中。
PHP中文网
PHP中文网 2017-04-18 09:03:20
0
2
522

一个草图:

现实现在文件夹和子文件夹下查找目标字符串,
但不知如何提取包含目标字符的字符串,并写入到新文件中。

#!/usr/bin/env python
#-*- coding:utf-8 -*-
import os, sys
import fnmatch

listonly = False
skipexts = ['.js']
def visitfile(fname,searchkey):
    global fcount,vcount
    try:
        if not listonly:
            if os.path.splitext(fname)[1] in skipexts:
                if open(fname).read().find(searchkey) != -1:
                    print '%s has %s '%(fname,searchkey)
                    fcount+=1
    except: pass
    vcount +=1

def visitor(args,directoryName,filesInDirectory):
    for fname in filesInDirectory:
        # 返回文件所在路径和文件名
        fpath = os.path.join(directoryName,fname)
        if not os.path.isdir(fpath):

            visitfile(fpath,args)

def searcher(startdir,searchkey):
    global fcount,vcount
    fcount = vcount = 0
    os.path.walk(startdir,visitor,searchkey)

if __name__=='__main__':
    # root=raw_input("type root directory:")
    root = '/home/jiangbin/findJS'
    key=raw_input("type key:")
    searcher(root,key)
    print 'Found in %d files,visited %d'%(fcount,vcount)

run

type key:JSQ
/home/jiangbin/findJS/XXX.js has JSQ 
/home/jiangbin/findJS/JSQ.js has JSQ 
Found in 2 files,visited 19
PHP中文网
PHP中文网

认证0级讲师

membalas semua(2)
Peter_Zhu

Bukankah anda hampir selesai....

https://gist.github.com/wusisu/e08ee53513c4410cf9ddd1ba5b0b80f5
Saya melakukannya untuk anda

----Tetapi sebenarnya, menggunakan shell ok--------

find . -type f -name "*.js" | xargs grep work_to_be_searched

find . -type f -name "*.js" | xargs grep work_to_be_searched > out.txt
  • type f cari di sini bermakna hanya nama fail akan dipaparkan, yang berakhir dengan .js

  • Lulus

  • melalui xargs
  • Gunakan grep untuk mencari kata kunci

  • Akhir sekali gunakan > untuk mengeksport

洪涛

Jika anda menggunakan linux, maka saya cadangkan anda menggunakan grep:

$ ls mydir
a.js  b.js  c.js
$ grep JSQ mydir/*.js
mydir/a.js:abcdefg JSQ abcdefg
mydir/a.js:JSQ abcdefg abcdefg
mydir/a.js:abcdefg abcdefg JSQ
mydir/c.js:abcdefg JSQ abcdefg
mydir/c.js:JSQ abcdefg abcdefg
mydir/c.js:abcdefg abcdefg JSQ

(Dalam contoh di atas, terdapat sesuatu yang salah dengan paparan baris pertama, ia sepatutnya seperti ini: grep JSQ mydir/*.js)

Anda juga boleh mengimportnya ke dalam fail:

$ grep JSQ mydir/* > results.txt

Kemudian anda boleh menyusun dan menyusun statistik daripada results.txt.

Jika anda berkeras untuk menggunakan Python, saya menulis kod yang sepatutnya lebih dioptimumkan, anda boleh merujuknya:

import os
import glob

def search(root, key, ftype='', logname=None):
    ftype = '*.'+ftype if ftype else '*'
    logname = logname or os.devnull
    symbol = os.path.join(root, ftype)
    fnames = glob.glob(symbol)
    vc = len(fnames)
    fc = 0

    with open(logname, 'w') as writer:
        for fname in fnames:
            found = False
            with open(fname) as reader:
                for idx, line in enumerate(reader):
                    line = line.strip()
                    if key in line.split():
                        line = line.replace(key, '**'+key+'**')
                        found = True
                        print('{} -- {}: {}'.format(fname, idx, line), file=writer)
            if found:
                fc = fc + 1
                print('{} has {}'.format(fname, key))

    return vc, fc

search(root, key, ftype='', logname=None)

  • akan berada di bawah laluan root

  • Cari fail dengan sambungan fail ftype (jika tidak diberikan, semua fail akan diterima)

  • Cari di dalam untuk melihat sama ada ia mengandungi kata kunci key

  • Jika logname diberikan, fail log dengan serlahan '**' sebelum dan selepas kata kunci akan dikeluarkan Kandungannya ialah setiap baris

  • yang mengandungi kata kunci.

sebenarnya boleh digunakan seperti ini (search.py):

if __name__=='__main__':
    root = 'mydir'
    key = input("type key: ")
    vc, fc = search(root, key, 'js', logname='results')
    print('Found in {} files, visited {}'.format(fc, vc))

Lari:

$ python3 search.py
type key: JSQ
mydir/c.js has JSQ
mydir/a.js has JSQ
Found in 2 files, visited 3

fail log results:

mydir/c.js -- 0: abcdefg **JSQ** abcdefg
mydir/c.js -- 1: **JSQ** abcdefg abcdefg
mydir/c.js -- 2: abcdefg abcdefg **JSQ**
mydir/a.js -- 0: abcdefg **JSQ** abcdefg
mydir/a.js -- 1: **JSQ** abcdefg abcdefg
mydir/a.js -- 2: abcdefg abcdefg **JSQ**

Soalan yang saya jawab: Python-QA

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan