bash-4.1$ cat file1
userD
user3
userA
user1
userB
bash-4.1$ cat file2
user3
userB
userX
user1
user7
bash-4.1$ awk 'NR==FNR{Arr[$0]++;next}!($0 in Arr){print FNR}' file1 file2
3
5
Я решил опубликовать резюме обсуждения 20+ -комментариев выше.
Одно из решений предоставил @don _crissti, который предложил команду:
$ grep -E '.*_DB([^;]*)$' <filename>
который производит вывод
init_DB(DB *database, char *params[])
prep_DB() {
FILE * load_DB(const char * exppath, const char * expfname)
По его предложению я придумал следующую команду для исключения промежуточного результата, если это необходимо:
$ grep -E '_DB\(.*\)$' <filename>
Предположим, что это исходный файл C с именем file.c
.
Использованиеctags
:
$ ctags file.c
Это создает файл с именемtags
:
$ cat tags
init_DB file.c /^init_DB(DB *database, char *params[])$/
load_DB file.c /^FILE * load_DB(const char * exppath, const char * /
prep_DB file.c /^prep_DB() {$/
Может использоваться с vi
или vim
для автоматического перехода к определениям функций.
Вы также можете разобрать этот файл с помощью cut
иgrep
:
$ cut -f 1 tags | grep '_DB$'
init_DB
load_DB
prep_DB
В системах Ubuntu установка ctags
фактически приведет к установке exuberant-ctags
, что обеспечивает более подробный tags
вывод:
$ cat tags
!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_PROGRAM_AUTHOR Darren Hiebert /dhiebert@users.sourceforge.net/
!_TAG_PROGRAM_NAME Exuberant Ctags //
!_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/
!_TAG_PROGRAM_VERSION 5.9~svn20110310 //
init_DB file.c /^init_DB(DB *database, char *params[])$/;" f
load_DB file.c /^FILE * load_DB(const char * exppath, const char * expfname)$/;" f
prep_DB file.c /^prep_DB() {$/;" f
Здесь мы можем быть уверены, что получим определения функций только с помощью
$ awk '$NF == "f" && $1 ~ /_DB$/ { print $1 }' tags
init_DB
load_DB
prep_DB
Дело в том, что лучше использовать специализированный синтаксический анализатор языка C, чем пытаться учитывать все возможные стили программирования в awk
скрипте или регулярном выражении с grep
, который анализирует код C.
Вы также можете
$ ctags -x file.c
init_DB function 3 file.c init_DB(DB *database, char *params[])
load_DB function 12 file.c FILE * load_DB(const char * exppath, const char * expfname)
prep_DB function 8 file.c prep_DB() {
, а затем проанализируйте/отфильтруйте его так, как вам нужно. Номер — это номер строки определения. Все сводится к тому, что вы подразумеваете под «хочу найти».